shared_ptr reset之前get的指针,reset之后还能用?

NeDong 2020-02-24 03:52:02
上一段代码


#include <stdio.h>
#include <memory>

class Base
{
public:
Base() : var_(12) {
puts("con");
}
~Base() {
puts("des");
}

void prt() {
puts("hello");
}

virtual void show() {
printf("%d\n", var_);
}

int var_ = 2;
};

int main(int argc, char const *argv[])
{
auto a = std::make_shared<Base>();
Base* p = a.get();
a.reset();

p->prt();
p->show();
printf("var = %d\n", p->var_);

return 0;
}


clang++/g++编译之后,运行都是:

con
des
hello
12
var = 12


这里的 p 指针,在 reset 之后,还有效吗,为啥还能运行。
程序应该是访问了无效的内存,但是结果正确?
求解答
...全文
242 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
_mervyn 2020-11-19
  • 打赏
  • 举报
回复
引用 楼主 NeDong 的回复:
这里的 p 指针,在 reset 之后,还有效吗,为啥还能运行。 程序应该是访问了无效的内存,但是结果正确? 求解答
毫无疑问,reset之后p指向的对象已经析构并释放。 但是,你是否正确理解何为释放呢? 对象释放后,它所在的那片虚拟内存并不一定释放,可能还是属于进程的预定区域。只要它是可读的就可以读,可写的就可以写,可执行的就可以执行。
寻开心 2020-02-24
  • 打赏
  • 举报
回复
reset是重新绑定了新对象,对老的做计数器减一,老的引用计数为0就会释放, 但是本例老的还有其他的指向他——p, 所以没事儿
gouyanfen 2020-02-24
  • 打赏
  • 举报
回复
a指向了Base p取了a的指向 a.reset()只是改变了a本身,p还是继续指向Base,肯定是可以调用的 就比如 int i=1; int *a=&i; int *p=a; a=null; p还是指向i的地址,这个并没有影响,而且i所占用的内存并没有销毁

64,682

社区成员

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

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