"new"和"delete"在C++中被弃用了吗?

17 浏览
0 Comments

"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函数已经包括在内。然而,这里的问题不是关于内存泄漏的。

0
0 Comments

新的特性通常会取代旧的特性,因此有人可能会问,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',同时也可以根据需要使用新的特性。

0
0 Comments

“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{std::fopen(path, mode)};}”。

0
0 Comments

在现代C++中,既不鼓励使用裸的newdelete,也没有将其标记为废弃的特性。它们仍然是实例化动态分配对象的方法,但是最好将它们放在可以确保匹配的newdelete(以及new[]delete[])的(库)类中。对于动态分配,可以使用std::vector来代替new[]delete[],它可以更好地实现相同的功能并提供更安全的操作。而对于变长数组(VLA),它并不是标准的C++特性,虽然某些编译器将其作为扩展功能提供,但由于其不可移植性,应该避免使用。总之,在现代C++中,应尽量避免使用裸的newdelete,而是使用类库中提供的更安全和可靠的替代方法。

0