seg*_*ult 6 c++ smart-pointers c++11
注意代码
...
{
int* p = new int(0);
std::unique_ptr<int> q(p);
...
// make use of 'p'
}
...
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,唯一的指针q仅用于在时间到来时释放p。Q本身不使用。
由于q永远不会在声明它的行下方使用,因此它似乎可以在声明后立即释放,从而利用p “释放后使用”。
问题是q 保证在离开当前范围之前一直存在,还是编译器的优化器可以在之前自由释放它?
使用 as-if 规则,只要可观察到的行为相同,编译器就可以进行任何优化。
立即释放q/p不允许,因为那样你将使用悬空指针。
虽然它可以在范围结束之前调用析构函数:
{
int* p = new int(0);
std::unique_ptr<int> q(p);
...
// make use of 'p'
...
// No longer use of p (and q)
...
// Ok, can delete p/q now (as long there are no observable behaviors changes)
...
}
Run Code Online (Sandbox Code Playgroud)
由于operator new/delete可能会全局更改,编译器通常没有足够的信息(尽管链接器有),因此请考虑它们(可能)具有可观察的行为(作为任何外部函数)。
c++14 允许对新表达式进行一些省略/优化,所以
{
delete new int(42);
int* p1 = new int(0);
int* p2 = new int(0);
std::unique_ptr<int> q2(p2);
std::unique_ptr<int> q1(p1);
...
// make use of 'p1'/p2
...
}
Run Code Online (Sandbox Code Playgroud)
可以“代替”
{
// delete new int(42); // optimized out
std::unique_ptr<int[]> qs{new int [] {0, 0}}; // only one allocation instead of 2
int* p1 = q->get();
int* p2 = q->get() + 1;
...
// make use of 'p1'/p2
...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
219 次 |
| 最近记录: |