2012-08-31 60 views
0

我在尝试使用从我的DLL导出的函数时遇到问题。Windows已触发断点

我得到这一条消息(对不起,但我不能上传图片):

Windows已经引发了LibTester.exe一个断点。

这可能是由于堆损坏引起的,这表明LibTester.exe或其已加载的DLL的任何 中存在错误。

这也可能是由于用户按下F12而LibTester.exe有焦点。

输出窗口可能有更多诊断信息。

我有一个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 

在情况下,这是相关的,矢量结构类派生 IPrintable:

class IPrintable 
{ 
public: 
    ~IPrintable() 
    { 
     if (this->m_pStr != NULL) 
      delete[] this->m_pStr; 
    } 

    virtual char* ToString() = 0; 

protected: 
    char* m_pStr; 
}; 

任何一个有线索,以什么可能会导致这种行为?

+3

如果这是完整的代码,那么问题是'm_pStr'未初始化,但在'IPrintable'析构函数中被引用。 – john

+1

教科书案例如何char *'字符串和手动内存管理是非常丑陋的人谁想要错误的代码。 – Puppy

+0

IPrintable需要构造函数,复制构造函数和赋值运算符以正确初始化并复制其m_pStr成员。 –

回答

2

如果这是IPrintable的完整定义,则问题是m_pStr是单位化的,这意味着将会有一个不正确的delete[]调用。

这种失败:

v1 = Vector(); 

,因为创建一个临时Vector和故障析构函数被立即执行。要更正初始化m_pStr或更好的解决方案将使用std::string。如果您必须使用char*,那么您还必须实现复制构造函数和赋值操作符或防止复制(请参阅What is The Rule of Three?)。