将delete作为运算符或函数调用有什么区别吗?

Căt*_*icu 0 c++ visual-studio-2010

如果我使用Visual Studio 2010,以下语句之间是否有任何区别:

wchar_t *wszChar = new wchar_t;
delete wszChar;
Run Code Online (Sandbox Code Playgroud)

wchar_t *wszChar = new wchar_t;
delete(wszChar);
Run Code Online (Sandbox Code Playgroud)

我查看了调试器,似乎完成了同样的事情.

两者之间怎么样:

wchar_t *wszChar = new wchar_t[10];
delete[] wszChar;
Run Code Online (Sandbox Code Playgroud)

wchar_t *wszChar = new wchar_t[10];
delete(wszChar);
Run Code Online (Sandbox Code Playgroud)

从我所看到的情况来看,在所有4种情况下,内存都被正确释放.

Jer*_*fin 8

前两个是等价的.你不是把任何东西称为函数,你只是在表达式的一部分周围放置一组冗余的括号 - 大约相当于1+2*3vs. 1+(2*3)或者(太常见)return(23);vs.return 23;

在第二个中,您在[]添加括号时遗漏了,导致未定义的行为.

后者的典型(但绝对不能保证)结果将释放内存块本身,但无法为数组中的项调用析构函数.在你的情况下(char没有析构函数的数组)虽然无法检测到.您可能还会遇到其他副作用,例如OS停止执行程序.

例:

#include <iostream>

struct item {
    item() { std::cout << "create\n"; }
    ~item() { std::cout << "destroy\n"; }
};

int main() {
    std::cout << "test 1\n";
    item *items = new item[5];
    delete [] items;
    std::cout << "test 2\n";
    item *items2 = new item[5];
    delete items2;
}
Run Code Online (Sandbox Code Playgroud)

结果:

test 1
create
create
create
create
create
destroy
destroy
destroy
destroy
destroy
test 2
create
create
create
create
create
destroy
Run Code Online (Sandbox Code Playgroud)

......然后执行被操作系统暂停.