簡體   English   中英

關於C ++中刪除運算符的困惑

[英]Confusion about delete operator in C++

這看似簡單的問題,但我的朋友與我辯論說,下面的程序調用UB。 但是我認為他是不對的。 考慮以下程序:

#include <iostream>
int main()
{
    int* p=new int[3]();
    int* q=p;
    for(int i=0;i<3;i++)
        std::cout<<q[i]<<' ';
    delete[] q;
    std::cout<<'\n';
}

該程序的行為是否定義明確? 如果我寫delete [] p會怎樣 而不是delete [] q; 有效嗎

是的,程序定義明確。 首先,您創建一個分配給新分配的內存的指針。

int* p=new int[3]();

然后創建另一個指向該內存的指針

int* q=p;

然后,您可以使用該指針將數據分配到該內存中。 之后,刪除指向q指針,該指針與p相同,也可以。 程序返回,一切順利

delete並不關心您使用什么變量。 重要的是,指針指向的內存是用new創建的,並且您只能在內存上調用一次delete。

new[]運算符返回的指針不是分配的內存的開始,而是指向第一個對象(或索引為0的對象)。 現在, 基於您使用的編譯器 ,運行時系統將對象數n存儲在某個位置,如果您只知道p指向的內存位置,則可以在其中檢索該對象。

根據此博客 ,刪除向量反過來執行此操作:

當您執行“ delete [] p”時,您的意思是“ p指向一堆對象,但我沒有告訴您有多少對象。” 在這種情況下,編譯器需要生成額外的代碼來跟蹤需要銷毀的代碼數量。 當使用“ new []”分配向量時,這些額外的信息將保留在“秘密位置”。

由於執行int *q = p本質上指向同一數組的第0個對象,因此等效於調用delete[] qdelete[] p

沒有UB。 它將正常工作。 在此處添加的內容不多。

運算符delete只能應用於由運算符new分配的內存(即地址)。 如果分配一次,則還應該釋放(刪除)一次,因此不會使用哪個指針(變量存儲地址),因此您的代碼有效。

但是,請記住,在delete[] q之后,不必使用qp 最好的方法是將NULL分配給兩個指針。

暫無
暫無

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

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