C++ 简单C++;程序崩溃
出于某种原因,以下程序在打印“我到这里”之前崩溃。当我注释掉try-catch部分时,程序正常运行并退出C++ 简单C++;程序崩溃,c++,C++,出于某种原因,以下程序在打印“我到这里”之前崩溃。当我注释掉try-catch部分时,程序正常运行并退出 #include <iostream> int error_function () { throw 5; return 0; } int main () { double* b = new double[6]; for (int i = 0; i < 6; i++) { b[i] = i; }
#include <iostream>
int error_function () {
throw 5;
return 0;
}
int main () {
double* b = new double[6];
for (int i = 0; i < 6; i++) {
b[i] = i;
}
double* c = new double(*b);
for (int i = 0; i < 6; i++) {
c[i] = i+1;
}
for (int i = 0; i < 6; i++) {
std::cout << b[i] << " " << c[i] << std::endl;
}
try {
error_function();
}
catch (int t) {
std::cout << "catched an int: " << t << std::endl;
}
std::cout << "i got here" << std::endl;
return 0;
}
我不知道为什么会这样。任何帮助都将不胜感激 它崩溃了,因为在分配c时只分配了一个double,然后通过访问第一个double之后的元素来超越边界。在本例中,在异常处理之后,似乎进行了一些清理,并且glibc检测到了损坏的内存 问题是:
double* c = new double(*b);
for (int i = 0; i < 6; i++) {
c[i] = i+1;
}
double*c=新的double(*b);
对于(int i=0;i<6;i++){
c[i]=i+1;
}
它分配一个新的double来复制*b的值(或者b[0],如果您愿意的话),因为b只是一个指针,所以取消对它的引用不会调用复制数组的复制构造函数
您最好使用std::vector,因为它会自动为您处理任何内存分配和释放,并且是异常安全的。如果您的error\u函数
抛出了一个您没有处理的异常,那么它仍然会正确地清理,而您的新的
'd内存则不会正常运行
从技术上讲,这是未定义的行为,因此任何事情都可能发生。您的问题在于:
double* c = new double(*b);
这是为一个double分配空间,并给它一个初始值b[0]
。稍后您将分配给c[1]
等。这是未定义的行为。添加到答案
您的程序正在执行堆溢出
for (int i = 0; i < 6; i++) {
c[i] = i+1;
}
for(int i=0;i<6;i++){
c[i]=i+1;
}
双精度c[0]的地址为新的双精度,值为b[0]。但是c[1],c[2],。。。。它们可能覆盖与程序相关的任何其他系统信息,然后行为变得不确定
更改这一行,程序就会正常运行
double* c = new double[6];
for (int i = 0; i < 6; i++) {
c[i] = b[i]+1;
}
double*c=新的双精度[6];
对于(int i=0;i<6;i++){
c[i]=b[i]+1;
}
在从main返回之前,不要忘记调用delete[]。这可能是一个错误。或者至少回答了相同的错误~我不明白为什么要使用这样的数组。即使没有更好的容器,为什么不干脆
double b[6];双c[6]代码>你也可以将填充循环(甚至打印)组合成一个循环,或者如果你有C++11,可以使用std::iota
填充循环。嗨,克里斯,我这样写程序是因为我试图理解双C*=新双(b*)的确切功能。更准确地说,甚至使用new
的原则都是失败的。@DeadMG:的确,我强调了几个不使用它的原因。谢谢,谢谢tinman,这就清楚了。我写这个程序只是为了利用语言的一些特性。实际上,我不会以这种方式分配数组,而是使用std::vector。我认为OP的意思是将b元素的值复制到新分配的c元素,因此,在分配c之后,您需要包含一些东西来复制这些元素,以使其具有相同的功能。更好的是,我只是在分配c之后重新阅读了代码,现在我不确定他是否打算复制它,因为他立即覆盖了它。因此,这个版本或您以前的版本可能都适用。
double* c = new double[6];
for (int i = 0; i < 6; i++) {
c[i] = b[i]+1;
}