[英]Delete a pointer after the arithmetics
int main() {
int* i = new int(1);
i++;
*i=1;
delete i;
}
這是我的邏輯:
我將I遞增1,然后為其分配一個值。 然后刪除I,以便在泄漏原始內存的同時釋放內存位置。 我的問題在哪里?
我也嘗試了不同的版本。 每當我執行算術並刪除指針時,我的程序就會崩潰。
您的程序顯示的是幾種未定義行為的情況:
*i = 1
) 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.