我试着理解指针。问题是:在编译第二个for循环时,我不应该遇到分段错误吗?如果不是为什么不呢?我无法阻止任何访问y [0] [dim]之外的元素。
int main(){
int dim = 3;
int ordnung = 2;
double** y = new double*[ordnung];
for(int i = 0; i<ordnung; i++){
y[i] = new double[dim];
}
for(int i = 0; i<=100; i++){
cout << y[0][i] << endl;
}
delete[] y;
return 0;
}
输出也令我困惑:
0
0
0
1.63042e-332
0
0
0
6.520933e-319
并且正在进行零。这是什么意思?
答案 0 :(得分:1)
使用new[]
分配内存时,它不会以任何特定方式初始化内存。它的内容是不确定并且访问它,即使是阅读,也会导致未定义的行为。
您也会超出分配的内存范围,这也会导致未定义的行为。 C ++没有内置的边界检查。
然后你不会释放你分配的所有内存。对于每个new
,应该匹配delete
,并且对于每个new[]
匹配delete[]
。
最后一些注意事项:首先,如果您认为自己需要动态数组,那么您的下一个想法应该是std::vector
。
关于使用new
或new[]
时未初始化的内存,当然这取决于您分配的 。如果使用构造函数分配对象(或对象数组),那么当然会导致调用构造函数。构造函数可能或可能不,初始化对象。