创建一个shared_ptr向量的向量

时间:2017-01-10 20:43:09

标签: c++ c++11 shared-ptr smart-pointers

尝试创建shared_ptr到int的向量。

我哪里错了?谢谢。基思:^)

export abstract class Animal {

  protected constructor(public sound: string) {
  }

  makeSound() {
    alert(this.sound);
  }
}

export class Dog extends Animal {
  constructor() {
    super('woof');
  }
}

编译结果:

#include <iostream>
#include <vector>
#include <memory>

int main() {
    std::vector<std::shared_ptr<int> > w;
    std::vector<std::shared_ptr<int> >::iterator it_w;
    w.push_back(new int(7));

    std::cout << std::endl;
}

1 个答案:

答案 0 :(得分:9)

接受原始指针的std::shared_ptr<T>构造函数被标记为显式。 source。您将无法使用原始指针调用push_back,因为它不能隐式转换为std::shared_ptr<int> push_back作为参数。解决方案是使用emplace_back代替push_back或使用std::make_shared<int>

emplace_back匹配给予T&#39的构造函数之一的参数。

w.emplace_back(new int(7));

std::make_shared<int>返回std::shared_ptr<int>类型的对象,避免此问题。

w.push_back(std::make_shared<int>(7));

您可以将这些解决方案结合起来。

#include <iostream>
#include <vector>
#include <memory>

int main(int argc, char** argv) {
    std::vector<std::shared_ptr<int> > w;
    std::vector<std::shared_ptr<int> >::iterator it_w;
    w.emplace_back(std::make_shared<int>(7));

    std::cout << std::endl;
}

修改:作为附加说明,请始终使用std::make_shared<T>(...)而不是std::shared_ptr<T>(new T(...))。它旨在避免非常微妙的潜在内存泄漏。它还优雅地避免了new没有delete而可能会打扰某些人的情况。

编辑2:此外,std::make_shared<T>(...)具有性能优势,可避免在`std :: shared_ptr(new T(...))&#39;中进行额外分配。 see this answer