簡體   English   中英

使用結構作為指針定義變量

[英]defining a variable using a struct as pointer

我想使用struct來定義變量。
使用struct作為pointerno pointer使用pointer來定義變量會更好嗎?

例如,這是我的結構:

 struct mystruct {
    //data members
    double x, y, z; 
}

我在下面的代碼中使用它:

  void main() {
    mystruct s1;                    //form 1
    mystruct  * s2 = new mystruct;  //form 2
    //.....
}

哪個變量定義更好使用? s1或s2?

我個人嘗試盡可能避免使用指針和動態分配的內存。

  1. 必須始終檢查指針是否為空
  2. 動態內存可能導致內存泄漏
  3. 容易不小心分配了一個指針,而不是值s2 = ..而是* s2 =

有關此內容的先前討論,請參見指針是否不好?

如果可行,最好使用對象,而不是指針。

  1. 使用對象比使用指針和從堆分配內存要快。

  2. 使用對象可以減少代碼行,並使代碼行更簡潔。

  3. 使用對象避免了在不需要內存時需要釋放內存的問題。

除非有特殊的原因要使用指針(例如,如果要創建該結構的一堆實例並將指針存儲在向量中),通常最好不要這樣做。

這有幾個原因:

  1. 您必須記住刪除指針指向的內容,否則將導致內存泄漏。
  2. 您必須先取消引用指針,然后才能使用它所指向的東西。
  3. 如果您做了一些更改指針的操作(例如,向它添加值,或者是想向數據成員添加值),則會得到一個指向誰知道什么的指針。

總的來說,我寧願使用堆棧上的對象,而不是指向對象的指針,如果出於其他原因,除了不必擔心這些事情而使自己變得更容易外,我更喜歡。

關於您對類和結構的注釋(顯然已刪除),它們本質上是完全相同的。 它們在語法上略有不同(例如,類的成員默認情況下為私有,而結構的成員默認情況下為公共),但據我所知,並沒有真正的區別。 另外,指針並不在乎它所指向的東西。 實際上,它只有兩個數字:內存中的位置以及該位置處事物的預期大小。

  void main() { mystruct s1; //form 1 mystruct * s2 = new mystruct; //form 2 //..... } 

哪個變量定義更好使用? s1或s2?

s1

在C ++中, 僅在必須使用時才使用指針和動態內存分配。 如果您沒有從這些功能中獲得任何好處,那么您將只剩下它們的缺點。

手動new / delete 智能指針(例如std::unique_ptrstd::shared_ptr將面臨一些缺點:

  • 您的代碼中有更多間接。
  • 需要以一種或另一種形式進行nullptr完整性檢查。
  • 代碼中的詳細程度更高。

std::shared_ptr特殊缺點:

  • 即使在不需要內部同步的情況下,也可能會在多線程代碼中增加明顯的同步開銷。

您將只能通過手動new / delete面對的一些缺點:

  • 容易產生內存泄漏,因為必須手動釋放內存。
  • 傾向於在代碼中的任何地方都需要進行更多的nullptr完整性檢查。
  • 容易因意外刪除而產生不確定的行為。
  • 通過在釋放內存后訪問內存,很容易產生未定義的行為。
  • 很難使異常安全。

一些參考:

  • 如果您還delete了同一范圍內的對象,則無需使用new來創建該對象; 這樣的對象應該是局部變量。

    資料來源: https : //isocpp.org/wiki/faq/freestore-mgmt#new-java

  • 始終使用標准智能指針和非所有者原始指針。 除非在極少數情況下實現自己的低級數據結構(甚至將其很好地封裝在類邊界內),否則切勿使用擁有的原始指針和刪除。

    資料來源: http : //herbsutter.com/elements-of-modern-c-style/


PS: void main不是合法的C ++。 將其設為int main

暫無
暫無

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

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