我在尝试使用从DLL导出的函数时遇到问题。
我收到一条消息(抱歉,但我无法上传图片):
Windows在LibTester.exe中触发了断点。
这可能是由于堆的损坏,这表明LibTester.exe或任何错误 它已加载的DLL。
这也可能是由于用户在LibTester.exe具有焦点时按下F12。
输出窗口可能包含更多诊断信息。
我有一个Vector类,带有重载的赋值运算符和一些构造函数:
Vector::Vector() : X(0.0f), Y(0.0f), Z(0.0f) { }
Vector::Vector(const Vector& vector) : X(vector.X), Y(vector.Y), Z(vector.Z) { }
Vector::Vector(float x, float y, float z) : X(x), Y(y), Z(z) { }
.
.
.
Vector& Vector::operator=(const Vector& rhs)
{
this->X = rhs.X;
this->Y = rhs.Y;
this->Z = rhs.Z;
return *this;
}
问题只发生在我尝试将现有矢量分配给新矢量时 由构造函数生成:
Vector v1 = Vector(); //Works
Vector v2 = Vector(1.0f, 1.0f, 1.0f); //Works
v1 = v2; //Works
v1 = Vector(); //Fails
v1 = Vector(1.0f, 1.0f, 1.0f); //Fails
如果这是相关的,Vector struct 派生自类 IPrintable:
class IPrintable
{
public:
~IPrintable()
{
if (this->m_pStr != NULL)
delete[] this->m_pStr;
}
virtual char* ToString() = 0;
protected:
char* m_pStr;
};
任何人都知道可能导致这种行为的原因是什么?
答案 0 :(得分:2)
如果这是IPrintable
的完整定义,则问题是m_pStr
已被部分化,这意味着delete[]
的调用不正确。
这失败了:
v1 = Vector();
因为创建了临时Vector
并且立即执行了错误的析构函数。要更正初始化m_pStr
或更好的解决方案,请使用std::string
。如果必须使用char*
,则还必须实现复制构造函数和赋值运算符或防止复制(请参阅What is The Rule of Three?)。