class X
{
public:
X() {};
X(int) : X() { throw std::exception(); }
X(double) { throw std::exception(); }
~X();
};
Run Code Online (Sandbox Code Playgroud)
动态记忆怎么样?通常,构造函数中的异常意味着对象未完全构造,因此内存是干净的并且不会丢失.
但是上一个问题中的论点是在委托完成后对象完全构造(或完全初始化).这对回收内存有何影响?我希望记忆仍然是清洁的!
int main()
{
new X(5); // new called
// delete called because delegate completed.
// I assume:
// Memory re-claimed (because constructor did not complete)
// I assume the C++11 standard adjusted to compensate.
// As a constructor did complete.
}
Run Code Online (Sandbox Code Playgroud)
比较也是:
int main()
{
new X(5.0); // new called
// Delete **NOT** called
// Memory re-claimed (because constructor did not complete)
}
Run Code Online (Sandbox Code Playgroud)
如果清理内存,则需要从C++ 03规范中更改内存清理时间的定义.行为是如何改变的?
bam*_*s53 21
如果被调用的构造函数new
抛出异常,new
则自动释放分配的内存.委托构造者在这方面没有任何改变.
如果上述对象初始化的任何部分76通过抛出异常终止并且可以找到合适的释放函数,则调用释放函数以释放构造对象的存储器.
- C++ 11 [expr.new] 5.3.4/18
描述的"对象初始化的任何部分"包括构造函数调用和传递给构造函数的表达式的求值.
此外,此行为在C++ 98标准[C++ 98 5.4.3/17]中指定相同.委托构造函数的唯一区别是,如果您的心智模型以前基于完全构造的对象.给定的委托构造函数不再等于何时发生重新分配的实际规范.
在你的第一个例子中:
new X(5);
Run Code Online (Sandbox Code Playgroud)
事件的顺序是:
用第二个例子
new X(5.0);
Run Code Online (Sandbox Code Playgroud)
您可以通过替换分配和释放功能来观察此行为:
#include <iostream>
#include <cstdlib>
#include <stdexcept>
#include <new>
void *operator new(std::size_t s) {
if (void *ptr = std::malloc(s)) {
std::cout << "allocation\n";
return ptr;
}
throw std::bad_alloc{};
}
void operator delete(void *ptr) noexcept {
if (ptr) {
std::cout << "deallocation\n";
std::free(ptr);
}
}
struct S {
S() {};
S(int) : S{} { throw std::exception(); }
S(double) { throw std::exception(); }
~S() { std::cout << "destructor\n"; }
};
int main() {
std::cout << "test 1\n";
try {
new S(1);
} catch(...) {
std::cout << "exception caught\n";
}
std::cout << "test 2\n";
try {
new S(1.);
} catch(...) {
std::cout << "exception caught\n";
}
}
Run Code Online (Sandbox Code Playgroud)
该程序的正确输出是:
test 1
allocation
destructor
deallocation
exception caught
test 2
allocation
deallocation
exception caught
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
531 次 |
最近记录: |