重複の可能性:
パブリック演算子new、プライベート演算子delete: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;
}
私はgcc4.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]
この記事のコメントで、私はこのリンクを見ました-パブリックオペレーター新規、プライベートオペレーター削除:新規使用時にC2248を「プライベートメンバーにアクセスできません」
私がそれを正しく理解していない場合、コンパイラは適切な演算子deleteを呼び出すことによってコンストラクタから例外がスローされた状況でメモリリークを回避する必要があるため、コンパイルされません。しかし、なぜこのコードはコンパイルされて機能するのでしょうか?
#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;
}
gcc4.7.1ではコンパイルされません。
そして、このようなものを標準ライブラリにどのように実装する必要がありますか?
Comeauは、これらすべての例をコンパイルしているわけではありません。
"ComeauTest.c", line 15: error: function "Try::operator delete"
(declared at line 9) is inaccessible Try *t = new Try; ^
誰かが私にこれを詳しく説明してもらえますか?