簡體   English   中英

處理列表時應該使用指針嗎?

[英]Should I use a pointer when dealing with lists?

當對象的壽命更長,甚至超出范圍時,也應該使用指針,對嗎?

在這里,我只是創建一個電影m; 它會在堆棧上創建,並在超出范圍時自動刪除。

//In some header file
typedef struct{
Qstring name;
int id;
//...
} Movie ;


QList<Movie> movieList; //It's the same as the standard list of c++. 

//In a function somewhere else
void doSomething(/*...*/)
{
//Do something...
Movie m = { /* ... */ };
movieList.push_back( m );
}

列表將類型T的常量引用作為參數。 是地址,對吧? 但是當Movie m; 超出范圍將被刪除。 列表中的項目以某種方式保留下來。

但是,我的問題是我應該使用指針並創建Movie m; 在堆上還是這樣? 什么是更好的風格?

“當對象的壽命更長,甚至超出范圍時,也應該使用指針,對嗎?”

盡管確實會在執行超出范圍時自動破壞具有自動存儲持續時間的本地對象,但這並不一定意味着動態分配的對象的壽命更長。

在您的應用程序中,您具有全局變量:

QList<Movie> movieList;

表示在程序執行的整個過程中一直存在的容器。

“以某種方式保留列表中的項目”

創建Movie類型的對象並將其推入容器時:

Movie m;
...
movieList.push_back(m);

該對象的副本存儲在列表中。 副本是在不同的情況下創建的,主要是當您按值傳遞或返回值時,但是在大多數情況下,它不會對程序的性能產生負面影響。 編譯器將使用許多優化技術來提取副本...有時效果如此之好,以至於按值傳遞/返回可能比按引用傳遞更快。

我應該使用指針在堆上創建Movie m;嗎?

沒有! 一旦開始動態分配對象,您就要對自己的內存進行管理,並且許多事情可能變得比原本要復雜得多……包括可能且非常頻繁(通常是由於錯誤處理的不完善)而導致的內存泄漏問題, 懸空指針的問題可能使您陷入未定義行為和許多其他不愉快事物的陷阱。

盡可能避免動態內存分配。 使用具有自動存儲期限的對象,了解RAII習慣用法並樂於跟隨它。

暫無
暫無

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

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