[英]what does ::operator() do?
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);
}
}
我有未编译的代码-我也从未见过此代码。 这是调用构造函数吗? 结构中没有重载()运算符...
似乎很明显,无论谁编写了旨在调用::operator delete(safety)
(证据: safety
是一个指针;它是用::operator new(safety_size)
初始化的,在他们错误地调用::operator(safety)
,将其重置为零)。
至于整个代码的目的,我不知道-看起来它可能是相当糟糕的设计的一部分。
肯·布鲁姆(Ken Bloom)为该代码的目的提供了一个合理的答案:保留一些在紧急情况下要释放的紧急记忆(以留出足够的呼吸空间以发出错误消息)。 请参阅他的答案以获取更多详细信息。
关于此代码看起来正在做什么的注释:
在旧的Mac上(在MacOS X之前,甚至可能在某些低内存的手持式系统上),为了安全起见,您通常会保留一些内存,以便在内存不足时可以释放它,以便可以使用它提醒用户某些问题,并保存所有工作。 我在Jim Trudeau的Macintosh编程入门工具包中看到了该技术。
因此,这似乎是同一种事情-按大小保留一块内存,并在需要时释放它。 显然,程序员并不想采用更常见的safety=new char[safety_size]
成语: safety=new char[safety_size]
和delete[] safety
。
您试图在void*
上调用自由函数operator()
。 就我所知,这是不存在的。 因此,它不会为您编译。
如果对您要在此处完成的工作有任何想法,我将提供其他建议。
尽管::operator delete()
答案显然是正确的,但这里的人们仍然缺少关于()
运算符的语法细节。
这不能调用名为operator
的方法,因为operator
是保留字。
如果代码试图调用重载的括号运算符,则应该说operator()(safety)
-第一个()
告诉您它是括号运算符,第二个则传递参数。
即使您要解决此问题, ::operator()(safety)
(在全局范围内定义)也将不存在,因为(并且我将在此处引用G ++,因为它比我可以说的更好) 'operator()()' must be a nonstatic member function
。
您拥有的不是合法的C ++。 它将函数调用运算符作为在全局范围内声明的自由函数进行调用。 将函数调用运算符声明为任何范围内的自由函数都是非法的。 必须将其声明为非静态成员函数。
如果合法,它将调用如下所示的函数:
void operator ()(void *foo)
{
::std::cout << "operator()(void *)\n";
}
但是,如果将此类代码放入编译器,编译器会告诉您这是不合法的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.