struct reserved_memory
{
void *safety;
size_t safety_size;
reserved_memory(size_t size) : safety_size(size)
{
init();
}
bool use() {
if (safety) {
::operator(safety);
safety=0;
return true;
} else
return false;
}
private:
void init()
{
safety=::operator new(safety_size);
}
}
我有这个没有编译的代码 - 我以前也没见过这个。这是调用构造函数吗? struct ...
中没有重载()运算符答案 0 :(得分:6)
很明显,编写该代码的任何人都打算调用::operator delete(safety)
(证据:safety
是一个指针;它是用::operator new(safety_size)
初始化的,在他们错误地调用::operator(safety)
之后,他们将其重置为零。
至于整个代码的目的,我不知道 - 看起来它可能是一个非常差的设计的一部分。
Ken Bloom为代码的目的提供了一个合理的答案:保留一些紧急记忆,以便在可怕的情况下释放(给予足够的喘息空间以便能够发出错误信息)。有关详细信息,请参阅his answer。
答案 1 :(得分:5)
关于此代码似乎正在做什么的说明:
在旧版Mac上(在MacOS X之前,可能还在某些低内存手持系统上),您曾经保留一些内存作为安全保护,以便在内存不足时可以将其释放,以便您可以使用它来警告用户有什么不对劲并保存他们的所有工作。我在Jim Trudeau的Macintosh Starting Kit中看到了这种技术。
所以这似乎是同样的事情 - 按大小保留一块内存,并在需要时释放它。显然,程序员不想使用safety=new char[safety_size]
和delete[] safety
这个更常见的习语。
答案 2 :(得分:1)
您正试图在operator()
上调用免费功能void*
。据我所知,这不存在。因此,它不会为您编译。
如果我对你在这里想要完成的任何事情有任何想法,我会提供其他建议。
答案 3 :(得分:1)
虽然::operator delete()
答案显然是正确的,但这里的人仍然缺少关于()
运算符的语法细微之处。
这不能调用名为operator
的方法,因为operator
是保留字。
如果代码试图调用一个重载的括号运算符,它应该说operator()(safety)
- 第一个()
告诉你它是括号运算符,第二个传递参数。< / p>
即使您要解决这个问题,::operator()(safety)
(在全局范围内定义)也不可能存在,因为(我会在这里引用G ++,因为它说得比我好){{ 1}}。
答案 4 :(得分:0)
你拥有的不是合法的C ++。它将函数调用运算符称为在全局范围内声明的自由函数。在任何范围内将函数调用运算符声明为自由函数是不合法的。它必须声明为非静态成员函数。
如果它是合法的,它将调用一个看起来像这样的函数:
void operator ()(void *foo)
{
::std::cout << "operator()(void *)\n";
}
但是如果你把这样的代码放到编译器中,编译器会告诉你它不合法。