VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 647|回复: 5

[已解决] 这样释放指针对吗?

[复制链接]
63_avatar_middle
online_vip 发表于 2017-3-1 23:01:25 | 显示全部楼层 |阅读模式
本帖最后由 syxwange 于 2017-3-6 12:17 编辑

struct st{
void * pChar ;
int size;
}


func()
{
        std::vector < std::shared_ptr<st >> v1;
        auto pt1 = std::make_shared<st>();
        pt1->pChar = new char[10];
        pt1->size = 10;
        v1.push_back(pt1);
        //一些代码后
        v1.clear();
}


这个智能指针会自动释放吗?st中的pChar 指针能释放?




上一篇:webbrowser控件不能登录WEBQQ
下一篇:编译问题,希望懂e懂C/C++的可以帮帮我
51_avatar_middle
online_admins 发表于 2017-3-2 09:30:04 | 显示全部楼层
教楼主一个方法,你在 struct st 中加上构造和析构函数,之后看看析构函数会不会被调用,如果被调用了就是走了,如果没被调用就是没走!
74_avatar_middle
在线会员 发表于 2017-3-2 10:36:06 | 显示全部楼层
shared_ptr<T> 釋放的 是 T* (也就是你代碼中的 st*)
v1.clear(); 後 會自動 調用 delete st* 也就是 make_shared 時 new 出來 的pt1.get()
而 st中的 pChar 是另外一個 c指針 不會被釋放
st被釋放時 其析構函數 函數 會被 釋放 你可 在 st的 析構函數 中 釋放 pChar
  1. struct st{
  2.         char * pChar ;
  3.         int size;

  4.         st()
  5.         {
  6.                 pChar = nullptr;
  7.                 size=0;
  8.         }
  9.         ~st()
  10.         {
  11.                 if(pChar)
  12.                 {
  13.                         delete pChar;
  14.                 }
  15.         }
  16. };
复制代码
63_avatar_middle
ico_lz  楼主| 发表于 2017-3-2 13:09:18 | 显示全部楼层
本帖最后由 syxwange 于 2017-3-2 13:55 编辑
zuiwuchang 发表于 2017-3-2 10:36
shared_ptr 釋放的 是 T* (也就是你代碼中的 st*)
v1.clear(); 後 會自動 調用 delete st* 也就是 make_s ...


谢谢你的解答,我主要问题也是pChar释放了没有。如我改成这样呢?
struct MyStruct
{
        shared_ptr<char> pName;
        int size;       
};
74_avatar_middle
在线会员 发表于 2017-3-2 15:31:57 | 显示全部楼层
syxwange 发表于 2017-3-2 13:09
谢谢你的解答,我主要问题也是pChar释放了没有。如我改成这样呢?
struct MyStruct
{

這麼寫 是可以 但 有許多地方 要注意

shared_ptr 只能保存 new 的指針 不能 保存 new [] 因爲shared_ptr釋放內存時 調用的 是 delete 而非 delete []
(但是 一些 編譯器中 delete 和 delete[] 是一樣的 可能 在一些環境中正確 而另外一些 錯誤 你不能 依賴編譯器的行爲 最好 不要這樣寫)
所以 pName 只能 保存 一個 new char

但 pName 應該是一個 名稱 不會是一個 char 你需要的應該是 new char[n]
此時 你 可用 在 shared_ptr中 傳入 刪除器 要求使用 delete[] 而非默認的 delete 釋放內存(因爲 刪除器的 存在 shared_ptr 不止可以管理內存 還可用管理 其它各種資源 如 句柄 io ... 甚麼的)
  1. #include <iostream>
  2. #include <memory>
  3. #include <cstring>

  4. struct MyStruct
  5. {
  6.         std::shared_ptr<char> pName;
  7.         int size;
  8. };
  9. int main()
  10. {
  11.     MyStruct my;
  12.     my.pName = std::shared_ptr<char>(new char[10],
  13.         //定義刪除器
  14.         [](char* p)
  15.         {
  16.             delete[] p;
  17.         }
  18.     );
  19.     strcpy(my.pName.get(),"i'm king");
  20.     std::cout<<my.pName<<"\n";

  21.     return 0;
  22. }
复制代码


63_avatar_middle
ico_lz  楼主| 发表于 2017-3-6 12:13:23 | 显示全部楼层
zuiwuchang 发表于 2017-3-2 15:31
這麼寫 是可以 但 有許多地方 要注意

shared_ptr 只能保存 new 的指針 不能 保存 new [] 因爲shared_p ...

受指教了。谢谢你了,
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-6-20 02:14

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表