C++ 在返回函数中是否会自动调用动态分配(在堆上)的对象的析构函数?
也许这个问题很基本,但我没有找到答案 我将给出一些示例(当对象具有析构函数时),我将很高兴了解每个示例中发生的情况: (一) 我认为它不会调用析构函数,但有人告诉我,如果函数返回,那么将调用析构函数 (二) 现在呢?它是否连接到我们返回的对象实例 如果1)没有呼叫诽谤者,请确认3)没有呼叫析构函数(我仍然认为不会,但确认) (三)C++ 在返回函数中是否会自动调用动态分配(在堆上)的对象的析构函数?,c++,C++,也许这个问题很基本,但我没有找到答案 我将给出一些示例(当对象具有析构函数时),我将很高兴了解每个示例中发生的情况: (一) 我认为它不会调用析构函数,但有人告诉我,如果函数返回,那么将调用析构函数 (二) 现在呢?它是否连接到我们返回的对象实例 如果1)没有呼叫诽谤者,请确认3)没有呼叫析构函数(我仍然认为不会,但确认) (三) intf(){ 对于(int i=0;i C++绝对不是)。C++不是垃圾收集,如java。 每个new都必须与delete平衡,并且您需要将从new返回的指针传递
intf(){
对于(int i=0;i C++绝对不是)。C++不是垃圾收集,如java。
每个new
都必须与delete
平衡,并且您需要将从new
返回的指针传递给调用delete
(更正式地说,该指针也必须是同一类型的,或者是多态相关的)
<>幸运的是,C++确实提供了智能指针类,如“代码> STD::UnQuyJPPT<代码>,在其析构函数中包装<代码>删除<代码>调用.< /P> < p>在1的情况下,不调用析构函数,因为对象存在于<强>动态< /强>(堆)中内存,因此在对其调用delete
之前不会对其进行破坏。每个新
都需要一个匹配的delete
如果对象是在自动(堆栈)内存中创建的,则会调用析构函数,例如:
int f() {
Object p; // <-- no 'new'
int something=5;
return something;
} // <-- ~Object() is called here
在案例#3中,在动态内存中创建的对象在返回时也不会自动销毁
在这三种情况下,您都可以使用std::unique_ptr
提供动态对象的自动内存管理,例如:
int f() {
std::unique_ptr<Object> p(new Object);
int something=5;
return something;
} // <-- ~unique_ptr() is called here
intf(){
std::unique_ptr p(新对象);
int=5;
归还某物;
}//告诉您这一点的人都错了。当某个对象由new
构造时,它只会被delete
破坏。没有异常。可能的重复:尝试此类并查看何时调用析构函数:```类对象{public:Object()=default;~Object(){std::cout'
int f (){
for(int i=0; i<10; i++){
Object *p=new Object();
}
int something=5;
return something;
}
int f() {
Object p; // <-- no 'new'
int something=5;
return something;
} // <-- ~Object() is called here
Object f() {
Object *p=new Object();
return *p; // <-- copy made here
}
f(); // <-- ~Object() for the return value
// is called when the ';' is reached
int f() {
std::unique_ptr<Object> p(new Object);
int something=5;
return something;
} // <-- ~unique_ptr() is called here
std::unique_ptr<Object> f() {
std::unique_ptr<Object> p(new Object);
return std::move(p);
} // <-- ~unique_ptr() for p is called here
f(); // <-- ~unique_ptr() for the return value
// is called when the ';' is reached
int f() {
for(int i=0; i<10; i++) {
std::unique_ptr<Object> p(new Object);
} // <-- ~unique_ptr() is called here
int something=5;
return something;
}