【发布时间】:2013-11-22 13:01:47
【问题描述】:
当我尝试插入我的地图时遇到分段错误。
函数看起来像这样:
void add(std::string id, std::string name)
{
Asset asset(nullptr, false, name);
mAssets.insert(std::make_pair<std::string, Asset>(id,asset)); <-- This line gives segfault
}
mAssets 被简单地声明
std::map<assetID, Asset> mAssets;
资产类(草率)声明如下:
class Asset
{
public:
Asset(T* a, bool l, std::string f) : asset(a), loaded(l), filename(f)
{
}
Asset(const Asset& copy)
{
loaded = copy.loaded;
filename = copy.filename;
asset = new T();
*asset = *copy.asset;
}
~Asset()
{
delete asset;
}
Asset& operator=(const Asset& other)
{
Asset temp(other);
loaded = temp.loaded;
filename = temp.filename;
std::swap(asset,temp.asset);
return *this;
}
T* asset;
bool loaded;
std::string filename;
};
【问题讨论】:
-
你的assetId键类是什么?
-
assetID 是一个类型化的 std::string
-
通常是为了让代码更具可读性(至少对我而言),我更喜欢:
mAssets[id] = asset; -
您有时会将 nullptr 放入资产中(例如,在崩溃的函数中)-考虑当 *asset = *copy.asset 运行时会发生什么......您应该在复制构造函数中处理 nullptr 情况.
标签: c++ c++11 dictionary insert segmentation-fault