具有指针类型成员的类在 MSVS2012@debug 下销毁时失败.程序错误或错误源

class with pointer type member fails at destruction under MSVS2012@debug. Program error or bad source?

本文关键字:错误 失败 程序 MSVS2012@debug 类型 指针 成员      更新时间:2023-10-16

当我尝试使用 msvs2012 调试我的大程序时,如果我在调试模式下进行调试,它总是以 _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) 结束。在发布模式和 g++ 下(也带有 -O0 标志),它不会给出任何错误。我还阅读了一些关于这个主题的文章(类和析构函数中的错误消息和指针),但我找不到我的代码有什么问题。我在下面提供了一个最小(不)工作的例子。你能指出问题所在并展示如何解决吗?(使用 std 容器对我来说不是解决方案。

#include <iostream>
using namespace std;    

class block_data {
public:
    int size;
    double * data;
    block_data() {};
    block_data(int s)
    {
        size = s;
        data = new double [size];
        for (int i=0; i<size; ++i)
            data[i] = i;
    }
    ~block_data() {delete[] data;};
    block_data operator+(const block_data& toadd)
    {
        block_data C(toadd.size);
        for (int i=0; i<size; ++i)
            C.data[i] = data[i] + toadd.data[i];
        return C;
    }
    block_data& operator=(const block_data& copy)
    {
        for (int i=0; i<size; ++i)
            data[i] += copy.data[i];
        return *this;
    }
};

int main()
{
    block_data sum(10);
    for (int seed = 0; seed < 10; ++seed)
    {       
        block_data d(10);
        sum = sum + d;
    }
    return 0;
}

除了已经提到的复制构造函数问题之外,如果 toadd.size 小于 size,您将在运算符 + 中出现访问冲突,因为您将引用未分配的内存,赋值运算符也是如此。

似乎如果我添加一个复制构造函数,它会按照 Falcon 的建议解决问题@Dark。

block_data(block_data& tocopy) : size(tocopy.size), data(new double[tocopy.size])
{
    for (int i=0; i<size; ++i)
        data[i] = tocopy.data[i];
}
相关文章: