在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/C++/ 當(dāng) C++ 程序意外退出,還沒有及時清理的指針應(yīng)該如何處理

當(dāng) C++ 程序意外退出,還沒有及時清理的指針應(yīng)該如何處理

最近在寫串的時候總會遇到這樣的問題,調(diào)試的時候程序意外退出,導(dǎo)致后面申請的 char * 數(shù)組帶有之前的元素

比如

auto *arr {new char[10]};        //arr = ""
for(auto i {0}; i < 10; ++i) {
    arr[i] = 'a' + i;        //arr = "abcdefghij"
}

當(dāng)程序意外退出的時候,arr 可能沒有來得及釋放,導(dǎo)致下一次申請數(shù)組的時候,就算只申請 5 個空間,當(dāng)遇到剛好內(nèi)存相同的時候,新的數(shù)組就會是 "abcdefghij"

auto *arr {new char[5]};        //當(dāng)內(nèi)存沒來得及釋放,arr = "abcdefghij"

之前嘗試過在新的程序開始之前,用老的程序申請一個很大的空間并且釋放

#include <iostream>
int main(int argc, char *argv[]) {
    auto *arr {new char[100000]};
    delete []arr;
    return 0;
}

但是只有第一次釋放之后是正常的,接下來又會出現(xiàn)上面的情況
如果遇到這種情況,各位有什么好的解決方案嗎?

回答
編輯回答
笨笨噠

C++中不建議使用裸指針,最好使用shared_ptr或者unique_ptr

2018年3月27日 16:54
編輯回答
心悲涼

C/C++ 中,讀取一個未賦值(且沒有定義默認(rèn)值)的量是未定義行為

未定義行為是錯誤的行為。

正確的寫法是

auto *arr {new char[10]};
memset(arr, 0, sizeof(*arr) * 10);

// 此時數(shù)組 arr 的內(nèi)容皆為 0

/* ... */
2018年5月21日 05:31
編輯回答
淺淺

你應(yīng)該是for循環(huán)中,依然賦值了10個,然后分配的大小是5個。實際上并不存在你說的那個。程序退出后,改進程的相關(guān)內(nèi)存會被釋放,不會出現(xiàn)你描述的情景。

2018年2月22日 19:44
編輯回答
吢丕

進程退出后,整個內(nèi)存空間都會釋放。所以不用做任何處理。

另外 C++ 提倡用std::vectorstd::array。程序正常運行時,std::vector申請的空間會在析構(gòu)時自動釋放,崩潰的情況同上。

兩個進程的內(nèi)存空間應(yīng)該看成獨立的。即使映射到了相同的物理地址,也不應(yīng)該有所假設(shè)。

2017年2月14日 12:58