在 C++ 中,尤其是在讨论 RAII 时,我们真的根本不应该使用 C 风格的数组。标准库提供了许多具有不同属性的容器,这些属性消除了对 C 样式数组的大多数需求。默认情况下,您应该使用std::vector<>,除非您了解其他容器并且有令人信服的理由不使用1。
从您的评论来看,您似乎正在尝试构建一个字符串数据数组。这在现代 C++ 中很简单——只需使用std::vector <std::string>.
int main()
{
std::vector <std::string> myStrings;
myStrings.push_back ("hello");
myStrings.push_back ("goodbye");
}
这实现了您提到的所有成为 RAII 的目标,并且不需要new或delete任何东西。它还与其他标准库工具(例如find.
我确实说过“消除大多数需求”,强调我的。仍然偶尔需要去老学校。我不会在这里讨论它们,因为如果你真的需要它,你已经知道了。也就是说,如果你不知道你可能不需要它。
话虽如此,std::unique_ptr 确实支持使用特殊语法管理 C 样式数组:
std::unique_ptr <unsigned []> myArray (new unsigned [256]);
上面管理的数组myArray将delete []在销毁时正确删除。
由于没有unique_ptrshared_ptr's 的类似物,make_shared您要么必须使用new实际构造数组,要么提供您自己(或其他人)的实现make_unique
侧边栏: make_unique将添加到 C++14。
1 “你应该使用 std::vector<> 除非你了解其他容器并且有一个令人信服的理由不使用”
这不仅仅是我的意见。这也是整个StackOverflow 、C++ 的创建者 Bjarne Stroustup 和 C++ 标准本身 (23.1.1) 的一般(非官方)意见。