繁体   English   中英

:: operator()是做什么的?

[英]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()答案显然是正确的,但这里的人们仍然缺少关于()运算符的语法细节。

  1. 这不能调用名为operator的方法,因为operator是保留字。

  2. 如果代码试图调用重载的括号运算符,则应该说operator()(safety) -第一个()告诉您它是括号运算符,第二个则传递参数。

  3. 即使您要解决此问题, ::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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM