C++ 在返回函数中是否会自动调用动态分配(在堆上)的对象的析构函数?

C++ 在返回函数中是否会自动调用动态分配(在堆上)的对象的析构函数?,c++,C++,也许这个问题很基本,但我没有找到答案 我将给出一些示例(当对象具有析构函数时),我将很高兴了解每个示例中发生的情况: (一) 我认为它不会调用析构函数,但有人告诉我,如果函数返回,那么将调用析构函数 (二) 现在呢?它是否连接到我们返回的对象实例 如果1)没有呼叫诽谤者,请确认3)没有呼叫析构函数(我仍然认为不会,但确认) (三) intf(){ 对于(int i=0;i C++绝对不是)。C++不是垃圾收集,如java。 每个new都必须与delete平衡,并且您需要将从new返回的指针传递

也许这个问题很基本,但我没有找到答案

我将给出一些示例(当对象具有析构函数时),我将很高兴了解每个示例中发生的情况:

(一)

我认为它不会调用析构函数,但有人告诉我,如果函数返回,那么将调用析构函数

(二)

现在呢?它是否连接到我们返回的对象实例

如果1)没有呼叫诽谤者,请确认3)没有呼叫析构函数(我仍然认为不会,但确认)

(三)

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;
}