在 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_ptr
shared_ptr
's 的类似物,make_shared
您要么必须使用new
实际构造数组,要么提供您自己(或其他人)的实现make_unique
侧边栏: make_unique
将添加到 C++14。
1 “你应该使用 std::vector<> 除非你了解其他容器并且有一个令人信服的理由不使用”
这不仅仅是我的意见。这也是整个StackOverflow 、C++ 的创建者 Bjarne Stroustup 和 C++ 标准本身 (23.1.1) 的一般(非官方)意见。