欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Boost.shared_ptr必須注意的一些地方

雖然boost.shared_ptr是個(gè)非常好的東西,使用它可以使得c++程序不需要考慮內存釋放的問(wèn)題,但是還是有很多必須注意的地方。下面羅列了一些本人在實(shí)際工作中經(jīng)常碰到的使用shared_ptr出問(wèn)題的幾種情況。 

1. shared_ptr多次引用同一數據,如下:

{

int* pInt = new int[100];

boost::shared_ptr<int> sp1(pInt);

// 一些其它代碼之后

boost::shared_ptr<int> sp2(pInt);

}

這種情況在實(shí)際中是很容易發(fā)生的,結果也是非常致命的,它會(huì )導致兩次釋放同一塊內存,而破壞堆。 

2. 使用shared_ptr包裝this指針帶來(lái)的問(wèn)題,如下:

class tester

{

public:

       tester()

       ~tester()

       {

              std::cout << "析構函數被調用!\n";

       }

 

public:

       boost::shared_ptr<tester> sget()

       {

              return boost::shared_ptr<tester>(this);

       }

};

int main()

{

   tester t;

   boost::shared_ptr<tester> sp =  t.sget(); // …

return 0;

}

也將導致兩次釋放t對象破壞堆棧,一次是出棧時(shí)析構,一次就是shared_ptr析構。若有這種需要,可以使用下面代碼。

class tester : public boost::enable_shared_from_this<tester>

{

public:

       tester()

       ~tester()

       {

              std::cout << "析構函數被調用!\n";

       }

 

public:

       boost::shared_ptr<tester> sget()

       {

              return shared_from_this();

       }

};

int main()

{

   boost::shared_ptr<tester> sp(new tester);

 // 正確使用sp 指針。

 sp->sget();

 return 0;

}

 

3. shared_ptr循環(huán)引用導致內存泄露,代碼如下:

class parent;

class child; 

typedef boost::shared_ptr<parent> parent_ptr;

typedef boost::shared_ptr<child> child_ptr; 

class parent

{

public:

       ~parent() {

              std::cout <<"父類(lèi)析構函數被調用.\n";

       }

 

public:

       child_ptr children;

};

 

class child

{

public:

       ~child() {

              std::cout <<"子類(lèi)析構函數被調用.\n";

       }

 

public:

       parent_ptr parent;

};

 

int main()

{

     parent_ptr father(new parent());

       child_ptr son(new child);

       // 父子互相引用。

       father->children = son;

       son->parent = father;

    return 0;

}

       如上代碼,將在程序退出前,father的引用計數為2,son的計數也為2,退出時(shí),shared_ptr所作操作就是簡(jiǎn)單的將計數減1,如果為0則釋放,顯然,這個(gè)情況下,引用計數不為0,于是造成fatherson所指向的內存得不到釋放,導致內存泄露。 

4. 在多線(xiàn)程程序中使用shared_ptr應注意的問(wèn)題。代碼如下:

class tester

{

public:

   tester() {}

   ~tester() {}

// 更多的函數定義

};

 

void fun(boost::shared_ptr<tester> sp)

{

    // !!!在這大量使用sp指針.

  boost::shared_ptr<tester> tmp = sp;

}

 

int main()

{

    boost::shared_ptr<tester> sp1(new tester);

    // 開(kāi)啟兩個(gè)線(xiàn)程,并將智能指針傳入使用。

                    boost::thread t1(boost::bind(&fun, sp1));

                       boost::thread t2(boost::bind(&fun, sp1));

 

                       t1.join();

      t2.join();

    return 0;

}

   這個(gè)代碼帶來(lái)的問(wèn)題很顯然,由于多線(xiàn)程同是訪(fǎng)問(wèn)智能指針,并將其賦值到其它同類(lèi)智能指針時(shí),很可能發(fā)生兩個(gè)線(xiàn)程同時(shí)在操作引用計數(但并不一定絕對發(fā)生),而導致計數失敗或無(wú)效等情況,從而導致程序崩潰,如若不知根源,就無(wú)法查找這個(gè)bug,那就只能向上帝祈禱程序能正常運行。

可能一般情況下并不會(huì )寫(xiě)出上面這樣的代碼,但是下面這種代碼與上面的代碼同樣,如下:

class tester

{

public:

   tester() {}

   ~tester() {}

public:

   boost::shared_ptr<int> m_spData; // 可能其它類(lèi)型。

};

tester gObject;

void fun(void)

{

    // !!!在這大量使用sp指針.

  boost::shared_ptr<int> tmp = gObject.m_spData;

}

 

int main()

{

   // 多線(xiàn)程。

                    boost::thread t1(&fun);

                       boost::thread t2(&fun);

 

                       t1.join();

      t2.join();

    return 0;

}

情況是一樣的。要解決這類(lèi)問(wèn)題的辦法也很簡(jiǎn)單,使用boost.weak_ptr就可以很方便解決這個(gè)問(wèn)題。第一種情況修改代碼如下:

class tester

{

public:

   tester() {}

   ~tester() {}

// 更多的函數定義

};

 

void fun(boost::weak_ptr<tester> wp)

{

  boost::shared_ptr<tester> sp = wp.lock;

  if (sp)

{

     // 在這里可以安全的使用sp指針.

}

else

{

   std::cout << “指針已被釋放!” << std::endl;

}

} 

int main()

{

    boost::shared_ptr<tester> sp1(new tester);

    boost.weak_ptr<tester> wp(sp1);

    // 開(kāi)啟兩個(gè)線(xiàn)程,并將智能指針傳入使用。

                    boost::thread t1(boost::bind(&fun, wp));

                       boost::thread t2(boost::bind(&fun, wp));

 

                       t1.join();

      t2.join();

    return 0;

}

       boost.weak_ptr指針功能一點(diǎn)都不weak,weak_ptr是一種可構造、可賦值以不增加引用計數來(lái)管理shared_ptr的指針,它可以方便的轉回到shared_ptr指針,使用weak_ptr.lock函數就可以得到一個(gè)shared_ptr的指針,如果該指針已經(jīng)被其它地方釋放,它則返回一個(gè)空的shared_ptr,也可以使用weak_ptr.expired()來(lái)判斷一個(gè)指針是否被釋放。

boost.weak_ptr不僅可以解決多線(xiàn)程訪(fǎng)問(wèn)帶來(lái)的安全問(wèn)題,而且還可以解決上面第三個(gè)問(wèn)題循環(huán)引用。Children類(lèi)代碼修改如下,即可打破循環(huán)引用:

class child

{

public:

       ~child() {

              std::cout <<"子類(lèi)析構函數被調用.\n";

       }

 

public:

       boost::weak_ptr<parent> parent;

};

因為boost::weak_ptr不增加引用計數,所以可以在退出函數域時(shí),正確的析構。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
shared_ptr陷阱
C++11中的智能指針
C 異步調用時(shí)boost的 share
【轉】C++ 智能指針詳解
智能指針
Boost智能指針
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久