我从未理解为什么std::shared_ptr
和std::unique_ptr
与数组一起使用时会有所不同,即为什么我必须明确指定std::shared_ptr
的删除器?我知道我必须这样做,我不明白为什么它是这样设计的。
例如,对于class Foo{...};
类型的数组,使用std::unique_ptr
非常简单:
std::unique_ptr<Foo[]> upFoo(new Foo[128]);
而对于std::shared_ptr
事情则更加丑陋
// must specify deleter :(
std::shared_ptr<Foo> spFoo( new Foo[128], []( Foo *p ) { delete[] p; } );
不仅如此,编译器允许我编写类似
的内容// don't do it :(
std::shared_ptr<Foo> spFoo( new Foo[128]);
但删除时会调用delete spFoo;
而不是正确的delete[] spFoo;
。