C++ Windows已触发断点

C++ Windows已触发断点,c++,dll,C++,Dll,尝试使用从DLL导出的函数时遇到问题 我收到一条消息,其中说明(抱歉,我无法上载图像): Windows已在LibTester.exe中触发断点 这可能是由于堆损坏,这表明LibTester.exe或任何 它已加载的DLL的 这也可能是由于用户在LibTester.exe具有焦点时按下F12 输出窗口可能有更多诊断信息 我有一个向量类,带有重载赋值运算符和一些构造函数: Vector::Vector() : X(0.0f), Y(0.0f), Z(0.0f) { } Vector::Vector

尝试使用从DLL导出的函数时遇到问题

我收到一条消息,其中说明(抱歉,我无法上载图像):

Windows已在LibTester.exe中触发断点

这可能是由于堆损坏,这表明LibTester.exe或任何 它已加载的DLL的

这也可能是由于用户在LibTester.exe具有焦点时按下F12

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

我有一个向量类,带有重载赋值运算符和一些构造函数:

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;
};

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

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

这失败了:

v1 = Vector();

因为创建了一个临时的
向量
,并立即执行有故障的析构函数。要更正初始化
m\pStr
,或者更好的解决方案是使用
std::string
。如果必须使用
char*
,则还必须实现复制构造函数和赋值运算符或防止复制(请参阅).

如果这是完整的代码,那么问题是
mpstr
未初始化,但在
IPrintable
析构函数中被引用。如何
char*
字符串和手动内存管理的教科书案例适用于想要错误代码的非常丑陋的人。IPrintable需要一个构造函数,将构造函数和赋值运算符复制到正确的init并复制其mpstr成员。仍然无法正确答复,太糟糕了。。。谢谢大家的回答,原因确实是那个指针。我添加了一个构造函数、复制构造函数和赋值运算符,一切都解决了。希望我没有在实现中引入更多的问题。我不喜欢你的回答,非常不礼貌。