【发布时间】:2019-11-21 08:04:52
【问题描述】:
我正在尝试使用 unique_ptr 而不是自己分配内存。 我有以下代码:
class Album {
...
public:
Add(Song* song);
...
}
void func(){
...
std::unique_ptr<Album> album = std::unique_ptr<Album>{new Album()};
std::unique_ptr<Song> song = std::unique_ptr<Song>{new Song(soundtrack.data(), soundtrack.length())};
album->Add(song.get());
...
}
我的线路出现分段错误:
album->Add(song.get());
我尝试了多种变体来获取指针,包括 std::move 和 make_unique,但也许我不明白 unique_ptr 是如何工作得足以解决它的。
有什么想法吗?
【问题讨论】:
-
这还能编译吗?成员函数需要返回类型。
-
Add应该采用std::unique_ptr<Song>而不是Song*。然后你必须std::move:album->Add(std::move(song));。 -
@andreee,绝对!但是这里的逻辑表明是
Album负责歌曲,而不是func。 -
@O.B.我认为您需要提供更多信息。由于滥用
unique_ptr(如Evg所述),很可能您的album比song实例寿命更长。旁注:You should prefermake_unique在 ctor 中调用new。 -
智能“指针”的重点不是管理内存而是管理所有权;它们与实际指针几乎完全不同。它们不是可以让您免于思考生命和所有者的神奇精灵尘埃。使用通过
get获得的原始指针会遇到许多与使用通过&获得的相同的问题。
标签: c++ segmentation-fault unique-ptr