"new"和"delete"在C++中被弃用了吗?
"new"和"delete"在C++中被弃用了吗?
我偶然发现了一个涉及不同大小的数组声明的测验。我脑海中首先浮现出我需要使用动态分配和new
命令,就像这样:\n
while(T--) { int N; cin >> N; int *array = new int[N]; // 对'array'进行一些操作 delete[] array; }
\n然而,我看到其中一个解决方案允许以下情况:\n
while(T--) { int N; cin >> N; int array[N]; // 对'array'进行一些操作 }
\n经过一些研究,我了解到g++允许这样做,但这让我思考,在哪些情况下才需要使用动态分配呢?还是说编译器将其译为动态分配?\ndelete函数已经包括在内。然而,这里的问题不是关于内存泄漏的。
新的特性通常会取代旧的特性,因此有人可能会问,C++中的'new'和'delete'是否会被弃用。这个问题的出现是因为在上述内容中提到了一种新的特性——变长数组(Variable Length Arrays,简称VLAs),而VLAs是C99标准中的特性,虽然不是C++标准的一部分,但在某些编译器中(如g++)仍然被支持。然而,需要注意的是,VLAs与'new'和'delete'是不同的,它们并不以任何方式“废弃”'new'和'delete'。同时,还需要注意的是,VLAs并不符合ISO C++标准。
对于这个问题,目前没有明确的答案。C++标准委员会目前并没有宣布废弃'new'和'delete'的计划。因此,解决这个问题的方法就是继续使用'new'和'delete',并且根据需要使用新的特性。
总结一下,C++中的'new'和'delete'目前并没有被废弃,但也没有确定它们将来是否会被废弃。在编写代码时,我们可以继续使用'new'和'delete',同时也可以根据需要使用新的特性。
“new”和“delete”在C++中是否被弃用了?
首先,可以确定的是,“new”和“delete”并没有被弃用。
在你提到的特定情况下,它们并不是唯一的解决方案。选择使用哪个取决于你在“do something with array”注释下隐藏的内容。
你的第二个示例使用了非标准的可变长度数组扩展,它试图将数组放在堆栈上。这有一定的限制,即大小有限以及在数组超出作用域后无法使用该内存。你无法移动它,它将在堆栈展开后“消失”。
因此,如果你的唯一目标是进行本地计算,然后丢弃数据,那么它可能工作得很好。然而,更可靠的方法是动态分配内存,最好使用“std::vector”。这样,你可以根据运行时的值为确切数量的元素创建空间(这正是我们一直在寻求的),但它也会很好地清理自己,并且在需要时可以将其移出此作用域以保持内存的使用。
回到开始的问题,“vector”可能会在更深层次上使用“new”,但你不应该担心这一点,因为它提供的接口要优越得多。从这个意义上说,使用“new”和“delete”可以被认为是不鼓励的。
请注意“...few layers deeper”。如果你要实现自己的容器,仍然应避免使用“new”和“delete”,而是使用智能指针,如“std::unique_ptr”。
“std::unique_ptr”的默认析构函数调用“delete”或“delete[]”,这意味着所拥有的对象必须已经通过“new”或“new[]”分配,而这些调用已经被隐藏到C++14中的“std::make_unique”中。
当然,这是“default”删除器的行为。你可以创建一个基于“unique_ptr”的类型,并使用其他方式,而我一直使用的“FILE*”处理程序是“struct fcloser { void operator()(FILE* file) { std::fclose(file); }};”“auto open(char const* path, char const* mode = "rb") { return std::unique_ptr