<分区>
int ** foo()
{
int ** multiArray = new int*[3];
int one[3] = { 1, 2, 3 };
int two[3] = { 4, 5, 6 };
int three[3] = { 7, 8, 9 };
multiArray[0] = one;
multiArray[1] = two;
multiArray[2] = three;
return multiArray;
}
返回 multiArray 在上述函数之外工作,但我对内部箭头(一、二、三)的分配方式有所保留。我的第一 react 是它们分配在栈上,而不是堆上。我想要堆。尽管它们以某种方式在该函数之外为我工作,但当我尝试按我应该的方式删除它们时,它失败了。
如果我做这样的事情:
int ** allocatedMultiArray = foo();
int test = allocatedMultiArray[0][2]; // We get 3! Success!
for (int i = 0; i < 8; ++i)
{
delete[] allocatedMultiArray[i]; // FAILS!
}
delete[] allocatedMultiArray; // WORKS! (If we skip the above for loop of course)
我正在阅读有关多维数组的页面,他特别需要上面的 for 循环来释放 2D 数组(或 3D 数组的附加循环)。但是,回到我的 foo() 等价物,他使用带有循环的 new 运算符手动将数组分配到堆,而不是 { 1, 2, 3 } 初始化数组然后像我一样分配它。 http://www.cplusplus.com/forum/articles/7459/
因此,如果我跳过失败的 for 循环,是否会泄漏内存?我正在做的事情应该有效吗?我真的不想遍历 multiArray,在每个索引上调用 new,然后手动分配每个 int。这只是一个简化的 { 1, 2, 3 },但我有一个从不同函数获得的更复杂的数字集,使用 { } 符号读起来更好。
编辑: 该内部删除的失败是:
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.
编辑2: 因此,如果它是未定义的行为,并且没有像我最初认为的那样在堆上分配一、二、三数组,那么如何做如下事情:
int ** foo()
{
int ** multiArray = new int*[3];
for(int i = 0; i < 3; ++i)
{
multiArray[i] = new int[3];
}
multiArray[0] = { 1, 2, 3 }; // Fail "Too many initializer values" on 2
multiArray[1] = { 4, 5, 6 }; // Fail
multiArray[2] = { 7, 8, 9 }; // Fail
return multiArray;
}
编辑 3:不是重复的,因为我特别要求的答案与问题中提供的答案不同,而且我试图确定数组是在堆上还是堆栈上完成的。标记为重复的问题中均未解决这两个问题。事实上,我特别提到了那个问题中投票最多的答案,说它不够。