【发布时间】:2011-07-18 00:13:15
【问题描述】:
在阅读 Bruce Eckel 时,我遇到了以下示例:
#include <cstdio>
#include <cstdlib>
using namespace std;
void* operator new(size_t sz)
{
printf("operator new: %d Bytes\n", sz);
void* m = malloc(sz);
if(!m) puts("out of memory");
return m;
}
void operator delete(void* m)
{
puts("operator delete");
free(m);
}
class S {
int i[100];
public:
S() { puts("S::S()"); }
~S() { puts("S::~S()"); }
};
int main() {
puts("creating & destroying an int");
int* p = new int(47);
delete p;
puts("creating & destroying an s");
S* s = new S;
delete s;
puts("creating & destroying S[3]");
S* sa = new S[3];
delete []sa;
}
我对以下陈述有疑问:
请注意,使用
printf( )和puts( )而不是 iostream。这是因为当创建iostream对象时(如全局cin、cout和cerr),它会调用operator new来分配内存。使用printf( ),您不会陷入死锁,因为它不会调用new来初始化自身。
但是,当我在用cout替换 put 后运行程序时,我没有遇到这样的死锁。谁能解释一下?operator new返回一个 void 指针,但最终我们获得了指向动态分配对象的指针。那么它是一个构造函数返回一个指向对象的指针(this,尽管构造函数没有返回类型)还是它的编译器在内部执行 i?
【问题讨论】:
标签: c++ dynamic memory-management