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)
| 归档时间: |
|
| 查看次数: |
555 次 |
| 最近记录: |