簡體   English   中英

算術運算后刪除指針

[英]Delete a pointer after the arithmetics

int main() {
  int* i = new int(1);
  i++;
  *i=1;
  delete i;
}

這是我的邏輯:

我將I遞增1,然后為其分配一個值。 然后刪除I,以便在泄漏原始內存的同時釋放內存位置。 我的問題在哪里?

我也嘗試了不同的版本。 每當我執行算術並刪除指針時,我的程序就會崩潰。

您的程序顯示的是幾種未定義行為的情況:

  1. 您寫入尚未分配的內存( *i = 1
  2. 您可以釋放未分配的內容,從而有效地delete i + 1

您必須使用與從new返回的指針值完全相同的指針值調用delete別無其他。 假設您的其余代碼有效,則可以做int *j = i; int *i = new int(1); ,然后delete j; [例如int *i = new int[2]; 然后將使您的i++; *i=1; i++; *i=1; 有效代碼]

誰分配就是誰分配。 因此,您應該不能刪除自己沒有新增的內容。 此外, i++;*i=1; 是UB,因為您可以訪問受限的存儲區或只讀存儲器...

該代碼沒有意義。 我認為您有XY問題。 如果您可以發布原始問題,將有更多機會為您提供幫助。

在這種情況下,您需要簡短地了解堆內存管理的工作方式。 在特定的實現中,當您分配一個對象時,您會收到一個指向您可以使用的內存開始的指針。 但是,“真正”分配的內存從“更早”開始。 這意味着分配的塊比您請求分配的塊多一點。 塊的開始是您收到的地址減去一些偏移量。 因此,當您將遞增的指針傳遞給delete它將嘗試在其左側找到內部信息。 而且由於您的地址現在增加了,因此該搜索失敗將導致崩潰。 簡而言之。

讓我們逐步進行:

int* i = new int(1);  // 1. Allocate a memory.
i++;                  // 2. Increment a pointer. The pointer now points to
                      //    another location.
*i=1;                 // 3. Dereference a pointer which points to unknown
                      //    memory. This could cause segmentation fault.
delete i;             // 4. Delete the unknown memory which is undefined 
                      //    behavior.

簡而言之:如果您不擁有內存,就無法對其進行算術運算,也不能刪除它!

問題出在這里:

    i++;

這行代碼不會增加i指向的值,而是將指針本身增加一個int的字節數(在32位平台上為4)。 您打算這樣做:

    (*i)++;

暫無
暫無

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

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