社区
C++ 语言
帖子详情
删除对象指针为什么会出现段错误?
thinkperson_x201
2016-05-23 10:11:44
class B
{
int a;
int b;
public:
virtual ~B()
{
printf("B::~B()\n");
}
};
class D: public B
{
int c;
public:
virtual ~D()
{
printf("D::~D()\n");
}
};
int main()
{
B *pb = new D[2];
delete [] pb;
}
运行出现段错误:
段错误 (core dumped)
原因是什么?
...全文
316
3
打赏
收藏
删除对象指针为什么会出现段错误?
class B { int a; int b; public: virtual ~B() { printf("B::~B()\n"); } }; class D: public B { int c; public: virtual ~D() { printf("D::~D()\n"); } }; int main() { B *pb = new D[2]; delete [] pb; } 运行出现段错误: 段错误 (core dumped) 原因是什么?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
paschen
版主
2016-05-24
打赏
举报
回复
new D[2] 返回的类型是D*,中间你转换成B*是你的事,但在delete时你也要delete D*类型
int main() { B *pb = new D[2]; delete [] (D*)pb;
lm_whales
2016-05-24
打赏
举报
回复
因为分配的时候,并没有记录每个对象的类型 所以delete的时候,只能根据 指针的类型 delete 这样就不能准确找到每个对象了 如果是 单个对象。虚析构函数是可以准确析构的 数组是多个对象,因此除了第一个外,其他都不能准确析构
dustpg
2016-05-23
打赏
举报
回复
不要这么干,这是未定义行为,简单地说就是数组没有多态性。 虽然有点麻烦,但是也能好理解,规避也比较简单
腾讯2012笔试题目
腾讯2012笔试题目,包含很多普及型很高的题目
【C++】迭代器为什么
会
失效?它的底层原理是什么?什么情况下erase最后一个元素
会
出现
段错误
?
erase
删除
pos位置元素后,pos位置之后的元素
会
往前搬移,没有导致底层空间的改变,理论上讲迭代器不应该
会
失效,但是:如果pos刚好是最后一个元素,删完之后pos刚好是end的位置,而end位置是没有元素的,那么pos就失效了。因此
删除
vector中任意位置上元素时,vs就认为该位置迭代器失效了。这种行为在vs里面检查的十分严格,但是在linux下的g++就可能不
会
报错,为什么?
删除
了最后一个元素又为什么
会
出现
段错误
?
什么是智能
指针
?智能
指针
有什么作用?分为哪几种?各自有什么样的特点?一个
指针
占用多少字节?
这样,智能
指针
能够自动管理内存,避免了手动管理内存时的繁琐和错误,使得编写代码更加简单、灵活和易于维护。同时,由于智能
指针
内部实现了引用计数等机制,能够自动检测
指针
的使用情况,如果
指针
被非法访问,则
会
触发异常,从而避免了空悬
指针
等问题。请注意,这里提到的是
指针
本身在内存中占用的空间大小,而不是它所指向的数据的大小。同时,编译器可能
会
为了实现兼容性或其他目的,对
指针
的大小进行特殊处理,但通常情况下,
指针
的大小还是遵循上述规则的。这是因为
指针
需要足够的空间来存储内存地址,而内存地址的大小则取决于系统的位数。
C/C++面试:什么是智能
指针
?智能
指针
有什么作用?分为哪几种?各自有什么样的特点?
通过关键字inline,可以将函数声明为内嵌函数: inline double halve(double x){ return (x/2.0); } 被声明为内嵌函数的函数,在调用它的为止,代码
会
像宏一样展开。 下面是内嵌函数必须满足的规则和特征: 除非使用选项-O指明优化级别,否则不
会
有函数
会
被真正的、内嵌式的展开。这样做是为了简化调试器的用法。如果函数的属性为always_inline,他就
会
被迫展开为内嵌函数 声明内嵌函数的结果可以使代码更大或者更小,这依赖于函数的尺寸、建立调用框架的复杂
什么是“NULL
指针
”,“悬空
指针
”和“野
指针
”?
1,什么是NULL
指针
? NULL用于指示
指针
未指向有效位置。理想情况下,如果在声明时不知道
指针
的值,则应将
指针
初始化为NULL。另外,当由它指向的内存在程序中间被释放时,我们应该使
指针
为NULL。 2,什么是悬空
指针
? 悬空
指针
是没有指向有效内存位置的
指针
。当
删除
或释放
对象
时,如果不修改
指针
的值,就
会
出现
悬空
指针
,因此
指针
仍然指向释放后的内存的存储位置。以下是示例。 悬空
指针
C语言中的
指针
可以指向一块内存,如果这块内存稍后被操作系统回收(被释放),但是
指针
仍然指向这块内存,那么,此时...
C++ 语言
65,186
社区成员
250,526
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章