我正在使用自定义对象的共享指针向量,如下所示:
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
中的操作应该导致段错误。我怎么还能访问它?
答案 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
内的现有对象。