堆栈溢出与std :: make_unique但不与原始指针

moo*_*kid 3 c++ heap smart-pointers c++11

我想分配一个大对象(a bitset<1000000000>).由于要避免拥有原始指针,我尝试了以下声明:

auto foo()->std::unique_ptr<std::bitset<MAX>>;
...
{
    auto bar = foo();
}
Run Code Online (Sandbox Code Playgroud)

这给出了堆栈溢出错误(编译器是VS2013).但

auto foo()->std::bitset<MAX>*;
...
{
    auto bar = foo();
    ...
    delete bar;
}
Run Code Online (Sandbox Code Playgroud)

才不是.

执行foo()看起来像:

auto is_prime = 
        //std::make_unique<std::bitset<MAX>>(std::bitset<MAX>{});
        // or:
        new std::bitset<MAX>{};
is_prime->set();

(*is_prime)[0] = (*is_prime)[1] = false;

auto max_i = static_cast<int>(std::sqrt(MAX)) + 1;
for (auto i = 1; i < max_i; i++) {
        if ((*is_prime)[i]) {
                for (auto j = i * i; j < MAX; j += i) {
                        (*is_prime)[j] = false;
                }
        }
}

return is_prime;
Run Code Online (Sandbox Code Playgroud)

我错过了哪些显而易见的事情?

asc*_*ler 11

auto is_prime = 
   std::make_unique<std::bitset<MAX>>(std::bitset<MAX>{});
Run Code Online (Sandbox Code Playgroud)

此行在std::bitset<MAX>{}堆栈上创建临时bitset对象(),然后将其传递给new堆上-ed对象的复制构造函数.

要使用默认构造函数,您需要:

auto is_prime = std::make_unique<std::bitset<MAX>>();
Run Code Online (Sandbox Code Playgroud)