簡體   English   中英

簡單的C ++程序崩潰

[英]Simple C++ program crashes

由於某種原因,以下程序在打印“我到這里”之前崩潰。 當我注釋掉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;
}

這是程序崩潰時得到的全部輸出:

0 1
1 2
2 3
3 4
4 5
5 6
catched an int: 5
*** glibc detected *** ./main: free(): invalid next size (fast): 0x0000000001f22070 ***
======= Backtrace: =========
/lib/libc.so.6(+0x77806)[0x7f2b273a0806]
/lib/libc.so.6(cfree+0x73)[0x7f2b273a70d3]
./main[0x400d92]
(a bunch of stuff)
Aborted

我不知道為什么會這樣。 任何幫助將不勝感激!

之所以崩潰,是因為在分配c時只分配了一個double,然后通過在第一個元素之后訪問元素來超越界限。 在這種情況下,似乎在處理完異常之后就進行了一些清理,並且glibc檢測到內存損壞。

問題線是:

double* c = new double(*b);

for (int i = 0; i < 6; i++) {
        c[i] = i+1;
}

它分配一個新的double來復制* b(或b [0],如果您願意)的值,因為b只是一個指針,因此取消引用它不會調用復制數組的復制構造函數。

使用std :: vector會更好,因為它將自動為您處理任何內存分配和釋放,並確保異常安全。 萬一您的error_function拋出了一個您沒有處理的異常,它仍然可以正確清除,而您的new 'd內存則無法正常運行。

從技術上講,這是不確定的行為,因此任何事情都可能發生。

您的問題在這里:

double* c = new double(*b);

這是為一個double分配空間,並將其初始值設置為b[0] 稍后,您將分配給c[1]等。這是未定義的行為。

添加到timans答案。

您的程序正在堆溢出。

for (int i = 0; i < 6; i++) {
    c[i] = i+1;
}

double c [0]具有新的double地址和b [0]值。但是c [1],c [2],....它們可能會覆蓋與該程序有關的任何其他系統信息,因此行為變得不確定。

更改此行,程序應該可以正常運行

double* c = new double[6];
for (int i = 0; i < 6; i++) {
    c[i] = b[i]+1;
}

並且不要忘記在從main返回之前調用delete []。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM