我认为它将sizeof(A)
和return
地址的内存分配给pointer a
,我是对的吗?
第二个问题是,我不理解这一点::operator
为什么它使用符号::
和单词operator
?
A* a = ::operator new(sizeof(A));
答案 0 :(得分:7)
是的,你是对的,operator new()
(函数)与new
(关键字)不同,它只分配N个字节,不执行对象的初始化。但是,new
关键字使用operator new()
来分配内存。
与其他(标准)函数不同,operator new()
不是std
命名空间的一部分,而是位于全局命名空间中。因此,前面的::
强制编译器采用全局定义而不是更专业的定义。 E.g:
namespace foo {
void* operator new (std::size_t size)
{
std::cout << "custom implementation" << std::endl;
// some code...
}
void SomeFunc()
{
operator new(0); // prints "custom implementation"
::operator new(0); // prints nothing at all
}
}
答案 1 :(得分:4)
好吧,首先这个没有工作 - 当你编译它时会出现像
这样的错误t.cpp:2:32: error: invalid conversion from ‘void*’ to ‘A*’ [-fpermissive]
A* a = ::operator new(sizeof(A));
^
就其含义而言,这将调用全局范围内的函数operator new
。普通的全局operator new
分配指定的内存量并返回一个void *
指针(这就是你得到错误的原因)。
重要的是,这是不一个new
表达式 - 它只是一个函数调用,它调用通常用于为new
表达式分配内存的函数。它不会调用任何初始化程序以任何方式初始化内存。这是错误的另一个原因。
答案 2 :(得分:3)
1) ::
被称为scope resolution operator
。在C / C ++中,每个标识符都有一个范围,在该范围之外它不存在。默认情况下,标识符存在于全局命名空间中,除非它们是函数,类或命名空间的成员,它们作为本地标识符存在。在全局命名空间中声明的符号/变量/标识符使用::
运算符。
因此,您必须使用一元范围运算符(::)来访问在全局命名空间中声明的标识符,因为它可以隐藏,因为显式声明了具有相同标识符的另一个标识符在块或类中将其命名为自己的名称。换示例:
int random_number = 0;
int main(void)
{
int random_number = 0;
::random_number = 1; // set global random_number to 1
random_number = 2; // set local random_number to 2
return 0;
}
在random_number
函数内声明的main()
声明隐藏了在全局命名空间范围内(在main函数之上)声明的名为random_number
的整数。
通过使用像::random_number
这样的一元范围运算符,我们可以访问main()
函数内全局命名空间中声明的变量。
2) operator new()
表示一个函数,其声明为void* operator new ( std::size_t count );
,意味着它分配count
字节的内存/存储。如果分配请求的内存不足,operator new()
会返回NULL
或抛出exception