好吧,我在互联网上搜索了关于动态扩展数组的问题,并发现在C ++中这是不可能的。我必须使用C版本的malloc
,realloc
或C ++中的std::vector
。但是下面的代码似乎工作正常。
#include<iostream>
using namespace std;
int main() {
int len = 10;
int *p = new int[len];
for (int i = 0; i < len; i++){
p[i] = i + 1;
}
*(p + len) = 1000; // extend here.
len++;
for (int i = 0; i < len; i++){
cout << p[i] << endl;
}
return 0;
}
好吧,如果我在大型程序中使用这种方法,有什么问题吗?为什么人们说这是不可能的?如果是因为扩展区域可能已经填满了其他信息或其他任何内容? 我只是想知道上述方法是否正确。如果没有,那究竟是为什么?
答案 0 :(得分:4)
这有时会起作用,因为写入尚未分配的内存是未定义的行为。最终写下一个数组的结尾会让你遇到分段错误,当操作系统杀死你时,你会感到顽皮。
如果需要可调整大小的数组,请使用C ++ std::vector
。几乎没有缺点。它为您处理重新分配和取消分配的所有复杂问题。在调整大小时它也会做正确的事情,因此附加到数组是分摊O(1)。
你可以使用realloc
来调整数组大小,但可能会将其复制到新位置。 然而您无法对realloc
创建的内容使用new
!它必须已与malloc
和朋友分配。 new
和new[]
必须与delete
和delete[]
,malloc
一起使用,朋友必须使用free
。
如果使用C函数在C ++程序中分配内存,则会遇到其他危险。 C函数不会在为用户定义或标准库类型分配的数组上运行构造函数。
简而言之,直接分配和调整数组的大小充满了陷阱,当我们拥有一个在std::vector
中自动执行正确操作的精彩课程时,这是不值得的。
答案 1 :(得分:2)
它不时地运行而不会崩溃,然后崩溃......使用/覆盖你自己没有分配的内存是危险的。这是在野外高度利用的臭虫的理想来源。
根据您的情况,您可以保证阵列的10个元素属于您。然而,*(p+len)=1000;
这一行纯粹是邪恶的。因为那段记忆可能会分配给其他人。
我强烈建议你学习和使用valgrind。
答案 2 :(得分:0)
好吧,如果我在大型程序中使用这种方法,有什么问题吗?
是的,你会泄漏内存。每次拨打new()
都应该有相应的delete
电话。
另请注意,除了使用new()
分配的内容之外,您正在写入内存,这是一个让您的代码意外行为的调用。
使用std::vector<>
代替,将为您正确进行内存管理。
答案 3 :(得分:0)
不,上述方法不对。 *(p + len) = 1000; // extend here.
行会覆盖尚未分配的连续内存区域,因此如果您运气好,或者可以继续使用损坏的堆,您的程序可能会立即崩溃,这可能会更加麻烦。
这里的另一个问题是你没有释放分配的资源,所以如果你将使用更大的数据,你将遇到更大的内存泄漏。
也许请检查'vector'。