普通指针初始化unique_ptr指针问题

pixrane 2017-10-16 10:00:12
最近在看<<c++ primer>>第五版,12.1.5节的练习题引发的思考,如下代码:

void exercise12_17()
{
int ix = 1024,*pi = &ix,*pi2 = new int(2048);
typedef unique_ptr<int> IntP;
//IntP p0(ix);//ix不是指针类型
IntP p1(pi);
{
IntP p11(pi);
cout<<*p11<<endl;
}
cout<< *pi;

IntP p2(pi2);
IntP p3(&ix);
IntP p4(new int(2048));
IntP p5(p2.get());
}


第一个问题:P1的定义初始化编译通过,这不违法指针的唯一性吗?
于是试着思考下一个问题,我定义一个局部变量,代码块结束,自动释放内存,但pi还是能访问?
哪个大神帮忙解惑解惑,谢谢!
...全文
606 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xskxzr 2017-10-18
  • 打赏
  • 举报
回复
能访问又不代表程序是对的,数组还能越界访问呢,后果自负而已。
pixrane 2017-10-18
  • 打赏
  • 举报
回复
引用 5 楼 ananluowei 的回复:
int x,然后吧x的地址放在unique_ptr,这样做没问题? 不是new出来的,最后自动用delete释放,这样没问题?
编译没错,估计就像4楼说的那样理解吧,
大尾巴猫 2017-10-18
  • 打赏
  • 举报
回复
int x,然后吧x的地址放在unique_ptr,这样做没问题? 不是new出来的,最后自动用delete释放,这样没问题?
赵4老师 2017-10-16
  • 打赏
  • 举报
回复
栈中的变量通常包括函数参数和函数里声明的临时变量。 栈中的基本变量退出其作用域时,没有谁执行一段代码去释放/销毁/析构它所占用的内存,仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。 而栈中的类变量退出其作用域时,会自动执行其析构函数,…… 其实电脑开机后物理内存的每个字节中都有值且都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 理解讨论之前请先学会如何观察http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素
wh_ 2017-10-16
  • 打赏
  • 举报
回复
唯一性不就是只能关联一个指针吗?你又没有赋值给第二个指针为什么会违反唯一性? 不能访问了,pi已经是野指针了
ztenv 版主 2017-10-16
  • 打赏
  • 举报
回复
1、不违反,当然可以这么使用了,不过这就显得你初始化p1的指针是多余的,没有存在的必要 2、如果想指针离开作用域自动释放,则不应该使用unique_ptr,而是应该使用scoped_ptr

64,635

社区成员

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

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