Windows触发了一个断点

Windows has triggered a breakpoint

本文关键字:一个 断点 Windows      更新时间:2023-10-16

我在尝试使用从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结构是从IPrintable:派生的

class IPrintable
{
public: 
    ~IPrintable() 
    {
        if (this->m_pStr != NULL)
            delete[] this->m_pStr;
    }
    virtual char* ToString() = 0;   
protected:
    char* m_pStr;
};

任何人都知道是什么导致了这种行为?

如果这是IPrintable的完整定义,那么问题是m_pStr是统一的,这意味着delete[]的调用将不正确。

此操作失败:

v1 = Vector();

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