程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++內存越界問題及解決方法

C++內存越界問題及解決方法

編輯:關於C++

與內存洩露相比,C++最令人頭痛的問題是內存越界,而內存越界很多情況下是由於懸掛指針引起的。

假設一個指針變量:

Object * ptr;

使用ptr時,我們除了要判斷ptr是否為0以外,還要懷疑它指向的對象是否有效,是不是已經在別的地方被銷毀了。我們希望當它指向的對象被銷毀時,ptr被自動置為0。

顯然,C++沒有這種機制,但是,可以借助於boost::weak_ptr做到這一點。

inline void null_deleter(void const *)
{
}
class X
{
private:
    shared_ptr<X> this_;
    int i_;
public:
    explicit X(int i): this_(this, &null_deleter), i_(i)
    {
    }
    X(X const & rhs): this_(this, &null_deleter), i_(rhs.i_)
    {
    }
    X & operator=(X const & rhs)
    {
        i_ = rhs.i_;
    }
    weak_ptr<X> weak_this() const { return this_; }
};

定義變量:

weak_ptr<X>ptr=x.weak_this(); //x為一個X對象

則當x被銷毀時,ptr被自動置為無效。使用方法如下:

if(shard_ptr<X> safePtr =ptr.lock()) safePtr->do_something();

這種辦法用於單線程中,因為x 對象可能是基於棧分配的。如果需要在多線程中訪問X對象,那麼最好的辦法還是使用shared_ptr來管理對象的生命期。這樣的話,對於safePtr,可以保證在safePtr的生命期內,它所指向的對象不會被其它線程刪除。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved