【问题标题】:What does delete[something] do in visual studio?delete[something] 在 Visual Studio 中有什么作用?
【发布时间】:2020-02-04 15:39:51
【问题描述】:

我知道 C++ 标准不允许这样做,并且它不能在 gcc 上编译,但我想知道为什么它可以在 Visual Studio 中工作。

#include <iostream>

struct A
{
    A()
    {
        std::cout << \"A()\" << std::endl;
    }
    ~A()
    {
        std::cout << \"~A()\" << std::endl;
    }
};

int main()
{
    int n;
    std::cin >> n;
    A* arr = new A[n];
    delete[n] arr;
}

它与delete[] arr;、delete[n+5] arr;、delete[n/2] arr;、delete[-54] arr; 甚至delete[A{}] arr; 的行为相同。

  • 正如您所说,这在标准 C++ 中是不允许的,方括号必须为空。 placement-new 允许将附加参数传递给new,但delete 不允许。如果 VS 允许在 delete[] 上使用非空括号,那么这一定是 Microsoft 特定的扩展,但我没有在 MSDN 上看到它,here、here 或 here。
  • 我也没有看到,这就是我创建这个问题的原因。
  • 使用 Visual Studio 2019(版本 16.4.4)我收到警告 warning C4208: nonstandard extension used: delete [exp] - exp evaluated but ignored
  • 首先知道引入这个的原因会很有趣。 MSDN:docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/… 及其作用:stackoverflow.com/questions/1747976/…

标签: c++ visual-studio


【解决方案1】:

就我而言,您应该使用delete[] arr。否则你可能会得到Compiler Warning C4208。

使用 Microsoft 扩展 /Ze, 您可以使用带删除的括号内的值删除数组 操作员。该值被忽略。这些值在 ANSI 下无效 兼容性 /Za。

如果你尝试使用/Za,你会得到Compiler Error C2203。

更多详情,我建议您可以参考以下链接: C++ array delete operator syntax

【讨论】:

  • 根据微软自己的文档,/Za 仅适用于 C 模式。它甚至没有意义改变某些 C++ 扩展的行为。一个奇迹...
猜你喜欢
  • 2011-05-14
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多