我正在使用一些在框架上运行的遗留类型代码,因此我无法解释在较低级别上发生的事情,因为我不知道。
然而,我的代码创建了一系列目标。
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,但这就是问题所在。我应该指定使用它来避免这个问题吗?
答案 0 :(得分:5)
maxSize
的绝对值可能不是罪魁祸首:在任何计算机上分配30个指针应该没有问题,包括大多数微控制器。使用malloc
不会改变任何东西:你正在按照你在C ++中的方式进行分配。
以下是您错误的可能来源:
myObjects[maxSize+1] = NULL;
您已为maxSize+1
个项目分配了存储空间,因此有效索引介于0
和maxSize
之间。在最后一个元素之后写一个是未定义的行为,这意味着可能发生崩溃。你很幸运,有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;