儲存指標?還是副本?

來源:互聯網
上載者:User
今天測試一段新代碼的時候,發現一個BUG,原因是同事寫的一個類,在對其執行個體調用execute()方法之前,需要用pushParam()方法把類型為const char *的參數“壓”給該對象。class Foo {
public:
    void pushParam(const char *param);
    bool execute();
};從類的行為上來說,我理所當然地認為pushParam()會儲存一份字串的副本,原因是通常的STL演算法或容器都是這樣做,而且這樣也更安全,更重要的是,在這裡沒有任何注釋明確要求“這定的字串指標必須長時間(至不在Foo這個對象銷毀之前)保持有效“。而事實上,為了效率,Foo這個類的實現只是儲存了字串的指標,而不是個副本,它假定這個參數是長期有效,正好我這段新代碼在這裡push了一個臨時string對象,問題就產生了......其實這裡沒有孰是孰非的問題,問題的關鍵在於:
  1. 良好健全的注釋很有必要
  2. 代碼安全在絕大多數時候,勝過(所謂的)效率,之所以用“所謂的”,是因為在當今電腦的速度和空間下,儲存一個字串的副本的開銷,實在是微乎其微。
  3. 從DELPHI聯想到,如果C++有引用計數的string,那麼效率和安全都兼顧了。C++實現字串的引用計數相當方便,不同的是DELPHI把這一切隱藏在編譯器的背後。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.