网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
11月03日漏签0天
c++吧 关注:640,428贴子:2,116,539
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 10回复贴,共1页
<<返回c++吧
>0< 加载中...

看轮子哥的一篇博文的一个疑问,求解答。

  • 只看楼主
  • 收藏

  • 回复
  • invisible蜻蜓
  • <
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
“上一篇文章最后那个例子应该是我还没说清楚,所以有些人有这种“加上一个虚析构函数就可以了”的错觉也是情有可原的。Base* base = new Derived;之后你去delete没问题,是因为析构函数你还可以声明成虚的。但是Base* base = new Derived[10];之后你去delete[]发生了问题,是因为Derived和Base的长度不一样,所以当你开始试图计算&base[1]的时候,你实际上是拿到了第一个Derived对象的中间的一个位置,根本不是第二个Derived。这个时候你在上面做各种操作(譬如调用析构函数),你连正确的this指针都拿不到,你再怎么虚也是没用的。不过VC++单纯做delete[]的话,在这种情况下是不会有问题的,我猜它内部不仅记录了数组的长度,还记录了每一个元素的尺寸。当然,你直接用bases[1]->DoSomething()的时候,出事是必须的。”


是否因为第二种方式是未定义行为?


  • invisible蜻蜓
  • <
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
原文链接:http://www.cppblog.com/vczh/archive/2013/04/28/199805.html


2025-11-03 10:39:12
广告
不感兴趣
开通SVIP免广告
  • invisible蜻蜓
  • <
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

补充说明一下:在VS2015中二者的地址一致。


  • 心之刃
  • ->*
    15
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
还真是未定义行为
In the second alternative (delete array) if the dynamic type of the object to be deleted differs from its static type, the behavior is undefined.


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 10回复贴,共1页
<<返回c++吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示