windows和native android之间std :: shared_ptr的区别

时间:2017-04-13 17:32:59

标签: c++ shared-ptr

我正在使用自定义对象的共享指针向量,如下所示:

std::vector<std::shared_ptr<Thing>> Things;
void Foo()
{
   std::shared_ptr<Thing> newThing(std::make_shared<Thing>());
   //do something with newThing
   Things.push_back(newThing)
}

在其他一些函数Bar中,我试图从newThing访问原始指针,没有任何问题:

void Bar()
{
   Things.at(index).get();
}

但是,由于退出newThing后共享指针foo()的范围丢失,因此应调用Thing对象的析构函数,Bar中的操作应该导致段错误。我怎么还能访问它?

2 个答案:

答案 0 :(得分:3)

  

因为退出newThing

后共享指针foo()的范围会丢失

是的,但Things中的元素是该共享指针的副本。

  

应该调用Thing对象的析构函数

没有。向量中复制的shared_ptr包含另一个&#34;引用&#34;原始Thing对象,因此原始Thing对象也仍然存在。

这是shared_ptr的全部内容。

你真的不应该在不理解它是什么以及它做什么的情况下使用它。

  

Bar中的操作应导致段错误。

没有。即使您的代码错误且您有未定义的行为,也无法保证分段错误。你应该养成永远的习惯&#34;期待&#34;分段错误。

  

我如何才能访问此内容?

因为您的代码在Windows和Android上都很好。

答案 1 :(得分:0)

public function processSave() { $obj = parent::processSave(); $categoryIds = Tools::getValue('id_categories'); $id = $obj->id; Db::getInstance()->execute('delete from '._DB_PREFIX_.'adnquota_category where id_adnquota = '. pSQL($obj->id)); if($categoryIds) { for($i = 0; $i < count($categoryIds); $i++){ $rec = new AdnquotaCategoryModel(); $rec->id_adnquota = $id; $rec->id_category = $categoryIds[$i]; $rec->add(); } } return $obj; } 退出Foo时会被删除。此时newThing指向newThing并且引用计数为2(另一个引用由向量Thing保存)。当Things内的newThing被删除时,它会将引用计数减1,当您调用Foo时,它将访问向量Bar内的现有对象。