菜鸟求教个问题,这段代码是否会造成内存泄漏

zcm_xh2008 2013-08-26 03:15:17
WORD *pwPortNum = new WORD[20];
delete pwPortNum;

求教大神,这个代码是否会内存泄漏???
...全文
278 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
13820 2013-08-29
  • 打赏
  • 举报
回复
反正 我看 C++的 书 中 是要加方括号 delete [] pwPortNum;
xiaohuh421 2013-08-28
  • 打赏
  • 举报
回复
引用 16 楼 ri_aje 的回复:
[quote=引用 15 楼 xiaohuh421 的回复:] [quote=引用 13 楼 ri_aje 的回复:] Just made a quick check on "effective c++" by Scott Meyers, citing item 16 below. Item 16: Use the same form in corresponding uses of new and delete. ... std::string *stringPtr1 = new std::string; std::string *stringPtr2 = new std::string[100]; ... delete stringPtr1; // delete an object delete [] stringPtr2; // delete an array of objects ... What would happen if you didn't use the "[]" form on stringPtr2? Well, that's undefined too, but you can see how it would lead to too few destructors being called. Furthermore, it's undefined (and sometimes harmful) for built-in types like ints, too, even though such types lack destructors. The rule is simple: if you use [] in a new expression, you must use [] in the corresponding delete expression. If you don't use [] in a new expression, don't use [] in the matching delete expression. 楼上那位号称 "基本数据类型 delete 和 delete[] 才是等价的",还表示 "在effect c++ 还是在 高质量C++中有详细讲解",看来你唯一地救星就只能在 "高质量C++" 了,如果该书真的持有这种观点,那也只能叫低质量 c++ 了。
你这段说明书上说是未定义, 即使是 built-in types like ints. 确实是未定义的, 可能依赖于编译器的实现吧. 但至少, 在VS中那是不存在示定义的, 看一下反汇编代码, 真像大白. 对于书上的说明, 我相信也是有道理的,也应该按配对的方式使用, 但我更相信实践. 事实就摆在眼前. [/quote] 没有质疑你的事实,你说的那套东西我也知道。 问题在于你的逻辑,你观测了 vs 某一个版本的具体行为,然后据此泛化的声称对于 c++ 语言,delete new built-in types [] 是没有问题的,错误就在于此,generalization without necessary evidence support. 你试了别的编译器吗?试了 vs 别的版本吗?你能保证你今天观测到的行为,将来会长久存在吗? 你这样教育别人,人家用你提供的知识,写包含未定义行为的代码,可能今天管用,以后完蛋了,或换个环境完蛋了,你管吗? 为什么要遵循标准,因为标准给予这样的保证,任何声称自己是符合 c++ 标准的编译器,就要实现标准规定的行为,标准只说了 new[] 要对应 delete[]。任何其他的观测都是局限于某局部的片面解释,无法形成足够的说服力得出通用的结论,就这样。你可以用这些事实去帮助理解 c++ 语意的具体实现技术,但并不代表学会了这些技术以后,就可以把原理推翻了。[/quote] 受教了, 确实不能以偏概全
turing-complete 2013-08-28
  • 打赏
  • 举报
回复
引用 16 楼 ri_aje 的回复:
[quote=引用 15 楼 xiaohuh421 的回复:] [quote=引用 13 楼 ri_aje 的回复:] Just made a quick check on "effective c++" by Scott Meyers, citing item 16 below. Item 16: Use the same form in corresponding uses of new and delete. ... std::string *stringPtr1 = new std::string; std::string *stringPtr2 = new std::string[100]; ... delete stringPtr1; // delete an object delete [] stringPtr2; // delete an array of objects ... What would happen if you didn't use the "[]" form on stringPtr2? Well, that's undefined too, but you can see how it would lead to too few destructors being called. Furthermore, it's undefined (and sometimes harmful) for built-in types like ints, too, even though such types lack destructors. The rule is simple: if you use [] in a new expression, you must use [] in the corresponding delete expression. If you don't use [] in a new expression, don't use [] in the matching delete expression. 楼上那位号称 "基本数据类型 delete 和 delete[] 才是等价的",还表示 "在effect c++ 还是在 高质量C++中有详细讲解",看来你唯一地救星就只能在 "高质量C++" 了,如果该书真的持有这种观点,那也只能叫低质量 c++ 了。
你这段说明书上说是未定义, 即使是 built-in types like ints. 确实是未定义的, 可能依赖于编译器的实现吧. 但至少, 在VS中那是不存在示定义的, 看一下反汇编代码, 真像大白. 对于书上的说明, 我相信也是有道理的,也应该按配对的方式使用, 但我更相信实践. 事实就摆在眼前. [/quote] 没有质疑你的事实,你说的那套东西我也知道。 问题在于你的逻辑,你观测了 vs 某一个版本的具体行为,然后据此泛化的声称对于 c++ 语言,delete new built-in types [] 是没有问题的,错误就在于此,generalization without necessary evidence support. 你试了别的编译器吗?试了 vs 别的版本吗?你能保证你今天观测到的行为,将来会长久存在吗? 你这样教育别人,人家用你提供的知识,写包含未定义行为的代码,可能今天管用,以后完蛋了,或换个环境完蛋了,你管吗? 为什么要遵循标准,因为标准给予这样的保证,任何声称自己是符合 c++ 标准的编译器,就要实现标准规定的行为,标准只说了 new[] 要对应 delete[]。任何其他的观测都是局限于某局部的片面解释,无法形成足够的说服力得出通用的结论,就这样。你可以用这些事实去帮助理解 c++ 语意的具体实现技术,但并不代表学会了这些技术以后,就可以把原理推翻了。[/quote] 好!
ri_aje 2013-08-28
  • 打赏
  • 举报
回复
引用 15 楼 xiaohuh421 的回复:
[quote=引用 13 楼 ri_aje 的回复:] Just made a quick check on "effective c++" by Scott Meyers, citing item 16 below. Item 16: Use the same form in corresponding uses of new and delete. ... std::string *stringPtr1 = new std::string; std::string *stringPtr2 = new std::string[100]; ... delete stringPtr1; // delete an object delete [] stringPtr2; // delete an array of objects ... What would happen if you didn't use the "[]" form on stringPtr2? Well, that's undefined too, but you can see how it would lead to too few destructors being called. Furthermore, it's undefined (and sometimes harmful) for built-in types like ints, too, even though such types lack destructors. The rule is simple: if you use [] in a new expression, you must use [] in the corresponding delete expression. If you don't use [] in a new expression, don't use [] in the matching delete expression. 楼上那位号称 "基本数据类型 delete 和 delete[] 才是等价的",还表示 "在effect c++ 还是在 高质量C++中有详细讲解",看来你唯一地救星就只能在 "高质量C++" 了,如果该书真的持有这种观点,那也只能叫低质量 c++ 了。
你这段说明书上说是未定义, 即使是 built-in types like ints. 确实是未定义的, 可能依赖于编译器的实现吧. 但至少, 在VS中那是不存在示定义的, 看一下反汇编代码, 真像大白. 对于书上的说明, 我相信也是有道理的,也应该按配对的方式使用, 但我更相信实践. 事实就摆在眼前. [/quote] 没有质疑你的事实,你说的那套东西我也知道。 问题在于你的逻辑,你观测了 vs 某一个版本的具体行为,然后据此泛化的声称对于 c++ 语言,delete new built-in types [] 是没有问题的,错误就在于此,generalization without necessary evidence support. 你试了别的编译器吗?试了 vs 别的版本吗?你能保证你今天观测到的行为,将来会长久存在吗? 你这样教育别人,人家用你提供的知识,写包含未定义行为的代码,可能今天管用,以后完蛋了,或换个环境完蛋了,你管吗? 为什么要遵循标准,因为标准给予这样的保证,任何声称自己是符合 c++ 标准的编译器,就要实现标准规定的行为,标准只说了 new[] 要对应 delete[]。任何其他的观测都是局限于某局部的片面解释,无法形成足够的说服力得出通用的结论,就这样。你可以用这些事实去帮助理解 c++ 语意的具体实现技术,但并不代表学会了这些技术以后,就可以把原理推翻了。
xiaohuh421 2013-08-28
  • 打赏
  • 举报
回复
引用 13 楼 ri_aje 的回复:
Just made a quick check on "effective c++" by Scott Meyers, citing item 16 below. Item 16: Use the same form in corresponding uses of new and delete. ... std::string *stringPtr1 = new std::string; std::string *stringPtr2 = new std::string[100]; ... delete stringPtr1; // delete an object delete [] stringPtr2; // delete an array of objects ... What would happen if you didn't use the "[]" form on stringPtr2? Well, that's undefined too, but you can see how it would lead to too few destructors being called. Furthermore, it's undefined (and sometimes harmful) for built-in types like ints, too, even though such types lack destructors. The rule is simple: if you use [] in a new expression, you must use [] in the corresponding delete expression. If you don't use [] in a new expression, don't use [] in the matching delete expression. 楼上那位号称 "基本数据类型 delete 和 delete[] 才是等价的",还表示 "在effect c++ 还是在 高质量C++中有详细讲解",看来你唯一地救星就只能在 "高质量C++" 了,如果该书真的持有这种观点,那也只能叫低质量 c++ 了。
你这段说明书上说是未定义, 即使是 built-in types like ints. 确实是未定义的, 可能依赖于编译器的实现吧. 但至少, 在VS中那是不存在示定义的, 看一下反汇编代码, 真像大白. 对于书上的说明, 我相信也是有道理的,也应该按配对的方式使用, 但我更相信实践. 事实就摆在眼前.
xiaohuh421 2013-08-28
  • 打赏
  • 举报
回复
引用 9 楼 max_min_ 的回复:
我给的那个链接里的!就是基本类型char数组的!
你说的那个链接, 我也仔细看了,里面最后的结论还是只说没有配对使用, 行为未定义 . 但至少在VS2008中测试那是等价的, 并不是说从程序代码执行结果来看的. 依据如下: 首先, 对于自定义的类,或者数据结构, 使用new[]分配, 你可以通过如下方式获取分配的对象个数. A *pA = new A[11]; int nCount = *((int *)pA-1); 但使用new 单个对象是没有个数的. 对于基本数据类型, new与new[]都没有个数信息. new[] 类为什么会有数据个数呢?, 答案就是为了在delete[]的时候循环调用析构函数. 因为在VS IDE中的基本数据类型是没有析构的, 所以即使new[]也不会去存放个数信息, delete时直接释放内存即可. 所以才有 new[]申请的, delete和delete[]释放都是一样的. 就相当于delete[]在基本数据类型的情况下, 自动退化成delete. 对于对象数组: 最终调用的是: 000BB7AF call CMutexeLock::`vector deleting destructor' (0A1D75h) vector deleting destructor 即一个数组的释放析构. 在这个call里面会先循环调用析构函数, 然后再调用一次delete[] 释放全部内存,最终调用一次free() (注意是一次) 而单个对象调用的是: 000BB85C call CMutexeLock::`scalar deleting destructor' (0A2207h) scalar deleting destructor 即一个确定数量的释放析构. 在这个call中, 也跟上面类似, 但只调用一次析构函数, 然后调用 delete释放内存, 最终调用一次free() 而对一普通数据类型, delete和delete[]都最终调用的都是一次free()函数. 所以综上, 可以得出一个结论: 对于自定义数据类型, 需要区分delete与delete[]的原因是要调用析构函数, 而对于普通数据类型, 由于没有析构函数, 所以就不用区分delete和delete[]了. 如果这样都还是觉得有问题, 那就按标准建议来吧, 配对使用是最佳方式, 不用再纠结了这个问题了.
ri_aje 2013-08-28
  • 打赏
  • 举报
回复
Just made a quick check on "effective c++" by Scott Meyers, citing item 16 below. Item 16: Use the same form in corresponding uses of new and delete. ... std::string *stringPtr1 = new std::string; std::string *stringPtr2 = new std::string[100]; ... delete stringPtr1; // delete an object delete [] stringPtr2; // delete an array of objects ... What would happen if you didn't use the "[]" form on stringPtr2? Well, that's undefined too, but you can see how it would lead to too few destructors being called. Furthermore, it's undefined (and sometimes harmful) for built-in types like ints, too, even though such types lack destructors. The rule is simple: if you use [] in a new expression, you must use [] in the corresponding delete expression. If you don't use [] in a new expression, don't use [] in the matching delete expression. 楼上那位号称 "基本数据类型 delete 和 delete[] 才是等价的",还表示 "在effect c++ 还是在 高质量C++中有详细讲解",看来你唯一地救星就只能在 "高质量C++" 了,如果该书真的持有这种观点,那也只能叫低质量 c++ 了。
ri_aje 2013-08-28
  • 打赏
  • 举报
回复
引用 7 楼 xiaohuh421 的回复:
[quote=引用 6 楼 max_min_ 的回复:] 看看这个帖子吧!蛮多人说如果是数组的话,不可以delete ,而要delete[] delete 和delete []
注意前置条件, 必须是 基本数据类型 delete 和 delete[] 才是等价的. 如果是结构体,类等自定义的数据类型就不是一样的了. 在effect c++ 还是在 高质量C++中有详细讲解, 忘记哪本书里说的了.[/quote] 那你把原文发出来,也让大家见识一下。 同时把版本和章节,以及是否翻译版写清楚,这样别人也好验证。
turing-complete 2013-08-28
  • 打赏
  • 举报
回复
现在有没有这样的编译器,用new[]分配的内存却用delete释放,然后显示器爆炸掉?
引用 4 楼 ri_aje 的回复:
删除数组需要用 delete []; 否则是未定义行为。
turing-complete 2013-08-28
  • 打赏
  • 举报
回复
谬种流传啊。。。
max_min_ 2013-08-28
  • 打赏
  • 举报
回复
引用 8 楼 max_min_ 的回复:
[quote=引用 7 楼 xiaohuh421 的回复:] [quote=引用 6 楼 max_min_ 的回复:] 看看这个帖子吧!蛮多人说如果是数组的话,不可以delete ,而要delete[] delete 和delete []
注意前置条件, 必须是 基本数据类型 delete 和 delete[] 才是等价的. 如果是结构体,类等自定义的数据类型就不是一样的了. 在effect c++ 还是在 高质量C++中有详细讲解, 忘记哪本书里说的了.[/quote] 这个就是基本类型 char 数组阿[/quote] 我给的那个链接里的!就是基本类型char数组的!
max_min_ 2013-08-28
  • 打赏
  • 举报
回复
引用 7 楼 xiaohuh421 的回复:
[quote=引用 6 楼 max_min_ 的回复:] 看看这个帖子吧!蛮多人说如果是数组的话,不可以delete ,而要delete[] delete 和delete []
注意前置条件, 必须是 基本数据类型 delete 和 delete[] 才是等价的. 如果是结构体,类等自定义的数据类型就不是一样的了. 在effect c++ 还是在 高质量C++中有详细讲解, 忘记哪本书里说的了.[/quote] 这个就是基本类型 char 数组阿
xiaohuh421 2013-08-28
  • 打赏
  • 举报
回复
引用 6 楼 max_min_ 的回复:
看看这个帖子吧!蛮多人说如果是数组的话,不可以delete ,而要delete[] delete 和delete []
注意前置条件, 必须是 基本数据类型 delete 和 delete[] 才是等价的. 如果是结构体,类等自定义的数据类型就不是一样的了. 在effect c++ 还是在 高质量C++中有详细讲解, 忘记哪本书里说的了.
赵4老师 2013-08-28
  • 打赏
  • 举报
回复
对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行!
赵4老师 2013-08-28
  • 打赏
  • 举报
回复
不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实! 有人说一套做一套,你相信他说的还是相信他做的? 其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗? 不要写连自己也预测不了结果的代码!
xiaohuh421 2013-08-27
  • 打赏
  • 举报
回复
对于基本数据类型 delete 与 delete[]是等价的, 只有自定义类型才不同, 因为delete[]分别调用数组中每个的析构函数, 而delete只会调用第一个的析构函数.
ri_aje 2013-08-27
  • 打赏
  • 举报
回复
删除数组需要用 delete []; 否则是未定义行为。
max_min_ 2013-08-27
  • 打赏
  • 举报
回复
引用 5 楼 xiaohuh421 的回复:
对于基本数据类型 delete 与 delete[]是等价的, 只有自定义类型才不同, 因为delete[]分别调用数组中每个的析构函数, 而delete只会调用第一个的析构函数.
之前我和你的想法一样的! 看看这个帖子吧!蛮多人说如果是数组的话,不可以delete ,而要delete[] delete 和delete []
zcm_xh2008 2013-08-26
  • 打赏
  • 举报
回复
引用 2 楼 baichi4141 的回复:
不会 带不带[]只影响对所申请的空间内的对象是执行一次还是执行多次析构函数,对于没有析构函数的基础数据类型,delete和delete[]没有区别
谢谢,能具体介绍一下内部原理吗?
baichi4141 2013-08-26
  • 打赏
  • 举报
回复
不会 带不带[]只影响对所申请的空间内的对象是执行一次还是执行多次析构函数,对于没有析构函数的基础数据类型,delete和delete[]没有区别
加载更多回复(1)

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧