尝试创建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;
}
答案 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