0

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

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

2 回答 2

0

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

于 2013-10-14T19:20:50.347 回答
0

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

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];
}
于 2013-10-14T19:10:02.670 回答