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种情况下,内存都被正确释放.
前两个是等价的.你不是把任何东西称为函数,你只是在表达式的一部分周围放置一组冗余的括号 - 大约相当于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)
......然后执行被操作系统暂停.