C++ 初始化共享\u ptr数据成员

C++ 初始化共享\u ptr数据成员,c++,C++,我在初始化共享类型的私有数据成员时遇到问题 标题: 错误: 错误:类型“shared_ptr”未提供呼叫接线员 但是,这确实有效: std::共享数据单元*mallocsizeofuint8, 免费的 当然,这并不能提供期望的结果。您正在寻找的 MyClass::MyClass () : data_(new uint8_t) { } 或者更好 MyClass::MyClass () : data_(std::make_shared<uint8_t>()) { } 概念:, 注意

我在初始化共享类型的私有数据成员时遇到问题

标题:

错误:

错误:类型“shared_ptr”未提供呼叫接线员

但是,这确实有效:

std::共享数据单元*mallocsizeofuint8, 免费的

当然,这并不能提供期望的结果。

您正在寻找的

MyClass::MyClass () : data_(new uint8_t) {
}
或者更好

MyClass::MyClass () : data_(std::make_shared<uint8_t>()) {
}
概念:,


注意。这段代码使用shared_ptr,但实际上并不共享任何内容。对未共享的数据使用共享ptr是一种浪费。在这种情况下,请使用std::unique\u ptr或根本不使用指针。

我发现您的代码中存在以下问题:

成员值初始化的语法

这个

不是初始化成员变量的方式

MyClass::MyClass() : data_(value) {}
就是你怎么做的

在使用shared_ptr而不是malloc时,需要使用new来分配内存。一般来说,在使用C++时,使用新的代替Malc。 三,。malloc的参数太多

您需要为您的特定课程做什么:

MyClass::MyClass() : data_(std::make_shared<uint8_t>()) {
}
是一种有效的方法来构造共享的_ptr,最好使用

std::shared_ptr<uint8_t> ptr(new sizeof(uint8_t)));


将malloc用于uint8_t可能是无害的,因为在初始化变量后,可以将shared_ptr指向的值设置为正常值。但是,对于任何稍微复杂一点的情况,使用malloc都需要将对象的所有成员正确设置为sane值的代码。如果对象类型具有虚拟成员函数,我不确定malloc方法是否有效。

不要将malloc与shared_ptr一起使用。使用new。首先,您需要在ctor初始值设定项列表中进行赋值或初始化。其次,你应该停止使用malloc,使用std::make_shared,或者绝对有必要使用new。使用make_shared的更好风格,不是吗?@juanchopanza我无法在我的计算机上测试make_shared的使用。较新版本的g++可能会工作得更好。但是我能够测试我建议的代码。好的,但是make_shared是C++11,所以不使用它看起来很奇怪。@juanchopanza我能够测试make_shared。更新了答案。关于第2点:如果使用默认的删除器或类似的用户定义的删除器(使用delete),则只需要使用new。您可以使用malloc,如果您的providefree或使用free作为deleter。您是否应该使用malloc是另一个问题,超出了这个问题的范围。关于第3点:使用单个参数正确调用malloc。也许你把第二个shared_ptr构造函数参数误读为第二个malloc参数。使用make_shared更好,不是吗?@juanchopanza:是的,我还不习惯,但这是正确的方法。
MyClass::MyClass() : data_(value) {}
MyClass::MyClass() : data_(std::make_shared<uint8_t>()) {
}
std::shared_ptr<uint8_t> ptr(malloc(sizeof(uint8_t)), free);
std::shared_ptr<uint8_t> ptr(new sizeof(uint8_t)));
std::shared_ptr<uint8_t> ptr(make_shared<uint8_t>());