我目前正在練習指標算術,我不明白為什么這段代碼在執行最后一行delete [] arr;時出現了 "free(): invalid pointer "的錯誤。
我意識到,同樣的代碼在我的 Android 手機上使用 C4Droid 程式(使用編譯器 "G Bionic")時運行沒有任何問題,但在我的平板電腦上使用 GCC,它就是不作業。我發現的唯一方法是確保Arr陣列目前是指向第一個地址的。當它沒有指向時,似乎就會失敗。我不知道在我的手機上是否也應該失敗,或者是我在平板電腦上使用的IDE的配置問題(嘗試使用codeblocks和codelite)。你能幫忙嗎?
我也很清楚,我正在為陣列的前兩個點初始化數值,而從技術上講,選擇一個比這更小的陣列大小是可能的。這只是測驗而已。
#include <string>
#include <iostream>
int main()
{
int *arr{};
size_t size{}。
std::cout << "請輸入你想要創建的陣列的大小。"; std::cin >> size。
arr = new int[size]。
*(arr 0) = 5;
*(arr 1) = 10;
std::cout << " arr: " << arr << " (指標增量,我們移動了一個int,arr現在是arr 1)" << std::endl;
delete [] arr。
return 0;
uj5u.com熱心網友回復:
你并沒有洗掉你分配的同一個指標-- arr移動了這個指標。在任何沒有被new type[]分配的指標上呼叫delete[]是未定義的行為--它可能作業,它可能災難性地失敗,它可能在兩者之間做任何事情--但是你真的應該不依賴它。
uj5u.com熱心網友回復:
在你增加指標的這條陳述句之后 arr
std::cout << " arr: " << arr << " (指標增量,我們移動了一個int,arr現在是arr 1)" << std::endl。
指標現在沒有分配的記憶體的地址。
所以下一條陳述句
delete [ ] arr;
引起了未定義的行為。
你必須向操作者delete [] 傳遞一個指標,其值(地址)與操作者new回傳的值相同。
你可以這樣寫,例如
delete [] --arr;
使用遞減運算子將指標重置為初始值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/315449.html
標籤:
