可能的重复:
公共运算符 new、私有运算符删除:使用 new 时出现 C2248“无法访问私有成员”
http://efesx.com/2009/12/01/public-operator-new-and-private-operator-delete/
在这篇文章中,我读到这段代码应该给出一个错误:
#include <cstdlib>
struct Try {
Try () { /* o/ */ }
void *operator new (size_t size) {
return malloc(size);
}
private:
void operator delete (void *obj) {
free(obj);
}
};
int main () {
Try *t = new Try();
return 0;
}
我用 gcc 4.7.1 尝试过:
Compilation finished with errors: source.cpp: In function 'int
main()': source.cpp:11:14: error: 'static void Try::operator
delete(void*)' is private source.cpp:17:22: error: within this context
source.cpp:11:14: error: 'static void Try::operator delete(void*)' is
private source.cpp:17:22: error: within this context source.cpp:17:10:
warning: unused variable 't' [-Wunused-variable]
在这篇文章的评论中我看到了这个链接 -公共运算符 new、私有运算符删除:使用 new 时出现 C2248“无法访问私有成员”
如果我理解正确,它就不会编译,因为编译器应该在通过调用适当的运算符删除从构造函数抛出异常的情况下避免任何内存泄漏。但为什么这段代码可以编译并运行呢?
#include <cstdlib>
struct Try {
void *operator new (size_t size) {
return malloc(size);
}
private:
void operator delete (void *obj) {
free(obj);
}
};
int main () {
Try *t = new Try;
return 0;
}
按照标准它是否正确?
这段代码又如何呢?
#include <cstdlib>
struct Try {
void *operator new (size_t size) {
return malloc(size);
}
private:
void operator delete (void *obj) {
free(obj);
}
};
int main () {
Try *t = new Try();
return 0;
}
它不能用 gcc 4.7.1 编译。
那么这样的事情应该如何在标准库中实现呢?
Comeau 并未编译所有这些示例:
"ComeauTest.c", line 15: error: function "Try::operator delete"
(declared at line 9) is inaccessible Try *t = new Try; ^
有人可以详细地向我解释一下吗?