名称可能取得不当,前几天也是在csdn上看见一篇帖:构造函数中抛异常的问题,并且其中有个题目,大概是如下吧:先看看如下这段程序运行结果是什么呢?
#include <iostream>
void* operator new(size_t size)
{
std::cout << "new; size = " << size << std::endl;
return malloc(size);
}
void operator delete(void *p)
{
std::cout << "delete " << std::endl;
free(p);
}
class A
{
public:
A()
{
std::cout << "A" << std::endl;
throw int();
}
virtual ~A()
{
std::cout << "~A" << std::endl;
}
};
int main()
{
try
{
std::cout << "sizeof(A) = " << sizeof(A) << std::endl;
A *p = new A;
delete p;
}
catch(int i)
{
std::cout << "int exception = " << i << std::endl;
}
catch(...)
{
std::cout << "unknown exception " << std::endl;
}
char c = getchar();
return 0;
}
结果是是:
sizeof(A) = 4
new; size = 4
A
delete
int exception = 0
从中可以看出,在构造函数中抛异常是不会引起内存泄露的,operator new 分配出来的内存会被释放,但是
但是假设我们修改一下main函数,采用放置语法的new会出现什么问题呢?
修改成如下:
int main()
{
try
{
char *p1 = new char[4];
std::cout << "sizeof(A) = " << sizeof(A) << std::endl;
A *p = new (p1)A;
delete p;
}
catch(int i)
{
std::cout << "int exception = " << i << std::endl;
}
catch(...)
{
std::cout << "unknown exception " << std::endl;
}
char c = getchar();
return 0;
}
程序运行结果如下:
new; size = 4
sizeof(A) = 4
A
int exception = 0
为什么会如此呢:查看了《C++程序设计语言》,找到了原因:因为采用了放置语法,及表示,此处采用了非标准的分配,当然也需要非标准的释放,所以没有调用delete
呵呵!
#include <iostream>
void* operator new(size_t size)
{
std::cout << "new; size = " << size << std::endl;
return malloc(size);
}
void operator delete(void *p)
{
std::cout << "delete " << std::endl;
free(p);
}
class A
{
public:
A()
{
std::cout << "A" << std::endl;
throw int();
}
virtual ~A()
{
std::cout << "~A" << std::endl;
}
};
int main()
{
try
{
std::cout << "sizeof(A) = " << sizeof(A) << std::endl;
A *p = new A;
delete p;
}
catch(int i)
{
std::cout << "int exception = " << i << std::endl;
}
catch(...)
{
std::cout << "unknown exception " << std::endl;
}
char c = getchar();
return 0;
}
结果是是:
sizeof(A) = 4
new; size = 4
A
delete
int exception = 0
从中可以看出,在构造函数中抛异常是不会引起内存泄露的,operator new 分配出来的内存会被释放,但是
但是假设我们修改一下main函数,采用放置语法的new会出现什么问题呢?
修改成如下:
int main()
{
try
{
char *p1 = new char[4];
std::cout << "sizeof(A) = " << sizeof(A) << std::endl;
A *p = new (p1)A;
delete p;
}
catch(int i)
{
std::cout << "int exception = " << i << std::endl;
}
catch(...)
{
std::cout << "unknown exception " << std::endl;
}
char c = getchar();
return 0;
}
程序运行结果如下:
new; size = 4
sizeof(A) = 4
A
int exception = 0
为什么会如此呢:查看了《C++程序设计语言》,找到了原因:因为采用了放置语法,及表示,此处采用了非标准的分配,当然也需要非标准的释放,所以没有调用delete
呵呵!