我想知道当函数在其中创建对象时会发生什么

I'd like to know what happens when a function create objects in it

本文关键字:什么 创建对象 想知道 函数 在其中      更新时间:2023-10-16

我知道在函数中创建的对象在函数结束时被删除。(当不使用'new'时)

1。

void test() {
list<int> temp(5,5);
list<int>* temp2 = new list<int>(5,4);
}
int main() {
test();
return 0;
}

我可以看到对象'temp'的析构函数只被调用一次。那么分配给'temp2'的内存永远不会被删除吗?即使项目已经结束了?

2。

char* foo() {
    return "HELLO"
}
char* foo2() {
    char* temp = "HI"
    return temp
}
int main() {
    cout << foo() << endl;
    cout << foo2() << endl;
    return 0;
}

我可以看到它打印两个字符串,"HELLO"answers"HI"。但. .为什么?当一个物体是用"new"做的时候也是同样的情况吗?

如果你用new分配一个对象,它的析构函数只有在你用delete销毁它时才运行。如果您从未在对象上调用delete,那就是内存泄漏。(大多数现代操作系统会在程序终止时释放程序的所有内存,但是析构函数不会为泄漏的对象运行,因为它们是在程序已经结束后被释放的。)

"HELLO""HI"这样的字符串字面值不是动态分配的,所以它们不必被释放。foofoo2函数返回指向预定义数据的指针,这些数据与程序代码一起加载到内存中。(字符串字面值存储在标记为只读的内存区域中,因此您应该使用char const *来避免意外地试图修改其内容。)

SeongYun Ko,我相信你的疑问是:如果temp变量的值被删除,那么它是如何打印出来的?

你必须明白,当你调用函数foo或foo2时,你在这些函数中声明的变量将被创建和销毁…每次你打电话给他们。因此,如果您调用foo函数两次,您将打印出两个"HELLO"语句,逻辑过程将是这样的:

第一次调用foo函数:创建临时变量,返回临时变量,销毁临时变量,打印foo返回的变量

第二次调用foo函数:创建临时变量,返回临时变量,销毁临时变量,打印foo返回的变量

所以基本上每次你调用一个函数,里面的变量都会被创建和销毁,每次