【问题标题】:Windows has triggered a breakpointWindows 已触发断点
【发布时间】:2012-08-31 13:47:54
【问题描述】:

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

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

    virtual char* ToString() = 0;   

protected:
    char* m_pStr;
};

任何人都知道可能导致这种行为的原因吗?

【问题讨论】:

  • 如果这是完整代码,那么问题是m_pStr 未初始化,但在IPrintable 析构函数中被引用。
  • IPrintable 需要一个构造函数、复制构造函数和赋值运算符来正确初始化和复制它的 m_pStr 成员。
  • 还是不能正常回复,太糟糕了...谢谢大家的回答,确实是那个指针的原因。我添加了一个构造函数、复制构造函数和赋值运算符,一切都解决了。希望我没有在实施中引入更多问题。还有DeadMG:我不喜欢你的回答,很不礼貌。

标签: c++ dll


【解决方案1】:

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

这失败了:

v1 = Vector();

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多