我尝试使用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是如何工作得足够好来解决这个问题的。
有什么想法吗?
2条答案
按热度按时间ldfqzlk81#
您提供的代码编译和运行良好-因此您没有提供的部分一定有问题-我怀疑代码在
Add()
或它的returntype中,或者稍后使用指针作为necktschnagge。工作示例在gdbonline上:https://onlinegdb.com/r1oyXGK2S
首先我问一个问题,
what is the advantage you'll like to achive
通过使用std::unique_ptr
。考虑到一个唯一指针并不保证有一个指针对象-在Add()
中,你必须检查nullptr
!我认为从你的用法来看,你不想使用std::unique_ptr
:关键是,
std::unique_ptr
只有唯一的所有权。func()
::局部作用域album::Add()
::参数范围拥有它。
因为你没有使用
std::move()
,所以所有权仍然在func()
中,并且将在func()
结束时被销毁。为了避免这种情况,你还可以使用song.release()
(参见cpp-reference)。jdgnovmf2#
问题如下
所以一个可能的解决方案是...