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

时间:2014-08-21 02:14:57

标签: c++

我知道当函数到达它的末尾时,函数中创建的对象将被删除。 (当' new'未使用时)

1

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

int main() {
test();
return 0;
}

我可以看到析构函数只被调用一次对象&#39; temp&#39;。 然后分配给&#39; temp2&#39;从未删除?即使程序结束了吗?

2

char* foo() {
    return "HELLO"
}

char* foo2() {
    char* temp = "HI"
    return temp
}

int main() {
    cout << foo() << endl;
    cout << foo2() << endl;
    return 0;
}

我可以看到它打印出两个字符串,&#34; HELLO&#34;和&#34; HI&#34;。但为什么? 使用&#39; new&#39;?

创建对象时,情况是否相同?

2 个答案:

答案 0 :(得分:1)

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

您的"HELLO""HI"之类的字符串文字未动态分配,因此不必释放它们。您的foofoo2函数返回指向已加载到内存中的预定义数据的指针以及程序代码。 (并且字符串文字存储在标记为只读的内存区域中,因此您应该使用char const *以避免意外尝试修改其内容。)

答案 1 :(得分:0)

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

你必须明白,当你调用函数foo或foo2时,你在每次调用它们时都会创建和销毁你在这些函数中声明的变量。因此,如果你两次调用foo函数,你将打印出两个&#34; HELLO&#34;语句,逻辑过程将是这样的:

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

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

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