我应该使用Malloc吗?大型对象的错误

时间:2012-04-24 13:23:45

标签: c++

我正在使用一些在框架上运行的遗留类型代码,因此我无法解释在较低级别上发生的事情,因为我不知道。

然而,我的代码创建了一系列目标。

int maxSize = 20;
    myObjects = new Object*[maxSize+1];

    myObjects[0] = new item1(this);
    myObjects[1] = new item2(this);

    for(int i=2; i != maxSize+1; i++){
          myObjects[i] = new item3(this);
        }

    myObjects[maxSize+1] = NULL;

如果maxSize大于30,我会得到一大堆我从未见过的错误。 Visual Studio在xutility中突出显示错误:

const _Container_base12 *_Getcont() const
    {   // get owning container
    return (_Myproxy == 0 ? 0 : _Myproxy->_Mycont);
    }

我之前从未使用过Malloc,但这就是问题所在。我应该指定使用它来避免这个问题吗?

4 个答案:

答案 0 :(得分:5)

maxSize的绝对值可能不是罪魁祸首:在任何计算机上分配30个指针应该没有问题,包括大多数微控制器。使用malloc不会改变任何东西:你正在按照你在C ++中的方式进行分配。

以下是您错误的可能来源:

myObjects[maxSize+1] = NULL;

您已为maxSize+1个项目分配了存储空间,因此有效索引介于0maxSize之间。在最后一个元素之后写一个是未定义的行为,这意味着可能发生崩溃。你很幸运,有20个元素,但30个为你抽出这个bug。使用valgrind实用程序是捕获可能导致崩溃的内存错误的好方法,即使它们当前不会导致崩溃。

int maxSize = 20;
myObjects = new Object*[maxSize+1];

myObjects[0] = new item1(this);
myObjects[1] = new item2(this);

// if maxsize is 1, this loop could be trouble
for(int i=2; i != maxSize; i++){
    myObjects[i] = new item3(this);
}

myObjects[maxSize] = NULL;

答案 1 :(得分:2)

你将超越界限:

myObjects[maxSize+1] = NULL;

在您的示例中,您创建了一个包含21个项目的数组。这将从0..20开始,但你在这里试图写入第21个元素。

问题不在于new / delete,据我所见,我看不出有任何理由在此处切换到malloc

答案 2 :(得分:0)

你不应该在C ++中使用malloc();你应该使用new

有一个可能的例外:如果你必须分配一个你打算作为参数传递给一个函数的内存块,它最终将使用free()释放它。如果您使用new来分配这样的块,则free()可能会导致堆损坏。但这纯粹是假设 - 我从未见过这样的API!

答案 3 :(得分:0)

我认为您无法访问偏移量“maxSize + 1”。解决方案就像:

myObjects = new Object*[maxSize+2];
...
myObjects[maxSize+1] = NULL;