C++ 简单C++;程序崩溃

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; }

出于某种原因,以下程序在打印“我到这里”之前崩溃。当我注释掉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;
    }

    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;
}