如何在不使用c ++中的new运算符的情况下在堆中创建对象?

时间:2017-03-08 07:14:56

标签: c++ c++11 memory-management c++14 new-operator

C ++中的

bookshelf_id运算符用于在堆内存中创建新对象。我不知道如何在不使用new运算符的情况下在堆内存中创建对象。有可能,怎么样?

还有人可以建议我使用C ++中的new opeartor在堆栈中创建对象吗?

3 个答案:

答案 0 :(得分:2)

在我使用C ++的有限经验中,使用new运算符是在堆中创建公共对象的唯一方法。 HeapAlloc可以在堆中分配内存,但是如何在不使用new运算符的情况下在堆中创建类?

答案 1 :(得分:2)

在现代C++中,通常使用返回智能指针的函数std::make_uniquestd::make_shared来避免直接使用new

例如

class Object
{
public:
    Object(int i): i(i) {}
    // ...
    void do_stuff() { /*...*/ }

private:
    int i;
};

auto object = std::make_unique<Object>(4);

object->do_stuff();

现在您不必担心删除object

答案 2 :(得分:2)

要回答您的一个问题,您可以使用placement new在堆栈上分配对象。例如:

int main()
{
    using namespace std;

    char buf[sizeof(string)];                // allocate char array on stack
    string *str = new (buf) string{ "I'm a placement new string object" };

    cout << *str << endl;

    str->~string();                          // delete string object
                                             // character array object will be
                                             // automatically deallocated

    return 0;
}