是放置new操作符是否单独负责构造对象

问题描述 投票:0回答:2

分享一下我对新运营商的理解。新操作员做两份工作。

  1. 分配内存
  2. 在同一个地方构建记忆。

new 运算符使用全局方法::operator new() 分配内存,并使用放置 new 运算符在同一位置构造内存。新的展示位置也是全球版本。

如果我在类中重载 new 运算符,编译器将禁用同一类的内存分配和构造的全局方法。这意味着我需要重载 new 运算符来分配内存并放置 new 运算符来构造内存。 在下面的示例中,我只是重载 new 运算符来分配内存。

#include <iostream>
using namespace std;

class Base
{
    public:
    Base()
    {
        cout << __FUNCTION__ << endl;
    }
    
    void* operator new(size_t _size)
    {
        cout << "Base new operator" << endl;
        void *p = ::operator new(_size); // allocating dynamic memory using global new defination
        
        if(p == NULL)
        {
            cout << "Sorry, Memory allocation failed";
            return NULL;
        }
        return p;
    }
};

int main()
{
    Base *p = new Base();

    return 0;
}

输出:

Base new operator
Base

内存分配是通过重载的new操作符完成的,我不确定内存是否是使用全局放置new操作符构造的;如果是,谁在调用放置新运算符,如果不是,那么在没有放置新运算符的情况下如何构造相同的内存?

这可能是一个愚蠢的问题,但如果有人可以帮助我解决我的疑问,那么您的有用建议将极大地提高我的理解。

c++ new-operator placement-new
2个回答
0
投票

该对象被放置在重载的运算符 new 返回的内存中。无法覆盖定位本身,您只能覆盖它分配内存的方式。如果您还想控制放置位置,则需要执行其他操作,而不是覆盖 new 运算符(例如,在另一个函数中分配内存和 Construction_at)。


0
投票

在高层次上

new
用于构造一个对象。

使用分配变量时,它首先分配内存,然后在分配的内存上调用构造函数。

当使用放置新变体时,它仅在提供的内存上调用构造函数(假设您给出的指针指向合适的内存块)

您只能覆盖分配

new
运算符。重载它时,您不会覆盖构造部分,而只会覆盖内存分配部分(因此是类型不可知的签名)。
::operator new(size)
基本上等同于
malloc

因此,您的重载仅分配内存,并且将在重载返回的内存上调用构造函数

new

© www.soinside.com 2019 - 2024. All rights reserved.