[英]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[] q
和delete[] p
。
沒有UB。 它將正常工作。 在此處添加的內容不多。
運算符delete
只能應用於由運算符new
分配的內存(即地址)。 如果分配一次,則還應該釋放(刪除)一次,因此不會使用哪個指針(變量存儲地址),因此您的代碼有效。
但是,請記住,在delete[] q
之后,不必使用q
和p
。 最好的方法是將NULL
分配給兩個指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.