社区
C++ 语言
帖子详情
在try{}里new 出来的变量,如果不delete的话,会内存泄露马?
darkone
2007-05-22 03:27:32
如下
try
{
Sap_var sap = new Sap;
//此处的sap需要delete吗?
}
catch(...)
{
printf("test");
}
...全文
305
8
打赏
收藏
在try{}里new 出来的变量,如果不delete的话,会内存泄露马?
如下 try { Sap_var sap = new Sap; //此处的sap需要delete吗? } catch(...) { printf("test"); }
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
yoyo_alex_lw
2007-05-22
打赏
举报
回复
每一个new就要对应一个delete
taodm
2007-05-22
打赏
举报
回复
变量作用域问题。
try{}外面怎么可能看到try{}里面定义的局部变量嘛。
darkone
2007-05-22
打赏
举报
回复
但为什么在try{}外面delete sap会失败?
taodm
2007-05-22
打赏
举报
回复
每一个new就要对应一个delete
jianshi051
2007-05-22
打赏
举报
回复
似乎是动态内存分配里面遇到了异常都会不释放资源,造成所谓的内存泄露。
总之如果构造函数没有得到正常的完成的话,其析构函数也将得不到调用,并且后面的一系列的对象也将不能继续构造函数。
这里有一个例子,演示了当构造函数没有正常结束时不会调用相关联的析构函数。这个例子还显示了当在创建对象数组的过程中抛出异常时会发生什么情况:
#include<iostream>
using namespace std;
class Trace
{
static int counter;
int objid;
public:
Trace()
{
objid = counter ++;
cout<<"Constructing # "<<objid<<endl;
if(objid==3)
throw 3;
}
~Trace()
{
cout<<"Destructing # "<<objid<<endl;
}
};
int Trace::counter = 0;
int main()
{
try
{
Trace n1; //没有异常,完成构造
Trace array[5]; //第0,1号元素得到完全构造,但是之后的元素由于第2号元素构造失败,所以退出构造,第3,4号元素没有构造和析构。
Trace n2; //和上一句一样,由于抛出了异常,所以得不到构造,更加得不到析构。
}
catch(int i)
{
cout<<"caught "<<i<<endl;
}
return 0;
}
程序的输出结果为:
Constructing # 0
Constructing # 1
Constructing # 2
Constructing # 3
Destructing # 2
Destructing # 1
Destructing # 0
caught 3
或者可以用auto_ptr:
auto_ptr类模板是在头文件<memory>中定义的,它的构造函数接受一个指向类型属性的指针作为参数,它是一个用于封装指向分配的堆内存的指针。
珍惜生命远离CPP
2007-05-22
打赏
举报
回复
那在里new出来的都需要delete
WizardK
2007-05-22
打赏
举报
回复
new和delete必须匹配
mx19841031
2007-05-22
打赏
举报
回复
需要,不然内存泄漏
C/C++ 内存管理
new
delete
operator
new
与operator
delete
函数 内存泄漏
对于
new
和
delete
我们上述也说过了,
new
是先调用 operator
new
函数,来开辟空间,然后调用这
里
类型的构造函数;而
delete
是先调用西沟函数,然后再 调用 operator
delete
释放空间。
new
[] 是调用operator
new
函数完成N个对象空间的申请,然后在申请的空间上执行N次构造函数。
c++中
new
对象,如果不调用
delete
对象,该对象不
会
自动调用析构函数;
delete
对象才
会
自动调用类的析构函数(清空对象内部在堆区开辟的成员
变量
),同时可以清空在堆区创建对象时开辟的空间
C++中
new
的用法及显示调用析构函数 <p>最近被问到了C++内存池的问题,其中不免涉及到在指定内存地址调用对象构造函数以及显示调用对象析构函数的情况。</p> C++中
new
的用法
new
是C++中用于动态内存分配的运算符,在C语言中一般使用malloc函数。 (1)plain
new
顾名思义就是普通的
new
,就是我们惯常使用的
new
。分配内存,调用构造函数,在C++中是这样定义的: 1 voi...
C++内存分配
new
和
delete
的使用、内存的五个区
数组声明有一个限制:被声明的长度必须是编译时常量,即在程序运行之前,编译器必须能在编译时确定长度,这意味着只限于用常量如数字字面量、enum值和用#define指令创建的常量。 动态分配内存 语法: 指针 =
new
类型;//请求创建单个数据对象 指针 =
new
类型 [数值];//请求创建多个数据对象 当内存不需要时,要使用
delete
来释放它。
delete
指针;
delete
[] 指针; 如果内存分配失败,
会
返回空指针nullptr ...
【C++】内存管理 ——
new
和
delete
本文主要对 C 语言中的动态开辟内存的方式进行回顾,并对 C++ 中新增的
new
和
delete
操作进行详细讲解。
C++ 中的
new
/
delete
和
new
[]/
delete
[]深入理解
在 C++ 中,你也许经常使用
new
和
delete
来动态申请和释放内存,但你可曾想过以下问题呢?
new
和
delete
是函数吗?
new
[] 和
delete
[] 又是什么?什么时候用它们?你知道 operator
new
和 operator
delete
吗?为什么
new
[] 出来的数组有时可以用
delete
释放有时又不行?… 如果你对这些问题都有疑问的话,
C++ 语言
65,187
社区成员
250,526
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章