定位New与对象

本文讨论了C++中的定位new操作符在对象内存管理中的应用。使用定位new分配内存并初始化对象后,不能直接使用delete清除,因为这可能导致内存泄漏。错误示例中展示了定位new与delete配对使用时可能引发的问题,如错误地释放内存或导致程序异常。正确做法是确保析构函数被调用以避免内存泄漏。
摘要由CSDN通过智能技术生成

定位new与对象

当使用定位new运算符为对象分配内存时,注意调用对象的析构函数。因为delete运算符必须跟new配套使用,而不是跟定位new配套使用。所以使用定位new为对象分配空间并初始化对象之后,不能用delete清除对象。这时如果对象的构造函数中使用new申请了内存,就会导致内存泄漏,因为不能使用delete清除对象。例如:

class BadString{
	private:
		int len;
		char * str;
	public:
		BadString();
		BadString(const char *);
		~BadString();
		void show();
};

BadString::BadString(){
	str = new char[4];
	len = 3;
	strcpy(str, "C++");
	cout << "Using default constructor for: " << str << endl;
}

BadString::BadString(const char * s){
	len = strlen(s);
	str = new char[len + 1];
	strcpy(str, s);
	cout << "Using self-defined constructor for: " << str << endl;
}

BadString::~BadString(){
	cout << "Using destroyer for: " << str << endl;
	delete [] str;
}

void BadString::show(){
	cout<< "Printing current string: " << str << endl;
}

char * buffer = new char[512];
BadString * s1 = new (buffer) BadString("first");
s1->show();

//错误1,系统释放掉了整个buffer的空间
delete s1;
BadString * s2 = new (buffer + sizeof(BadString)) BadString("second");

//错误2,delete必须与new配套使用
BadString * s1 = new (buffer) BadString("first");
BadString * s2 = new (buffer + sizeof(BadString)) BadString("second");
delete s2;

//错误3,直接释放内存不会调用对象的析构函数
BadString * s1 = new (buffer) BadString("first");
BadString * s2 = new (buffer + sizeof(BadString)) BadString("second");
delete [] buffer;

//正确用法,手动调用析构函数
BadString * s1 = new (buffer) BadString("first");
BadString * s2 = new (buffer + sizeof(BadString)) BadString("second");
s1->~BadString();
s2->~BadString();
delete [] buffer;

在错误1中,不能将定位new运算符与delete配合使用。在这里虽然程序能够运行,并且也确实会调用s1的析构函数。但是却会导致程序直接释放整个buffer的空间,所以如果后面需要再次用到这个buffer空间就会出错。

错误2与错误1一样,都是将定位new运算符与delete运算符配合使用。但是错误2甚至都不能正常运行,这是因为s1buffer指向的是同一个地址,所以系统让delete s1这一语句运行。而s2buffer指向的不是同一个地址,所以系统判断该语句错误。

错误3中直接使用delete [] buffer释放了这块内存,而不管在这块内存上面定义的两个对象。从而导致这两个对象的析构函数没有调用就直接被释放掉内存,从而导致内存泄漏。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值