我知道当函数到达它的末尾时,函数中创建的对象将被删除。 (当' 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;?
创建对象时,情况是否相同?答案 0 :(得分:1)
如果使用new
分配对象,则只有在使用delete
销毁它时,析构函数才会运行。如果你从不在对象上调用delete
,那就是内存泄漏。 (大多数现代操作系统将在程序终止时释放所有程序的内存,但是析构函数不会为泄漏的对象运行,因为它们在程序结束后被释放。)
您的"HELLO"
和"HI"
之类的字符串文字未动态分配,因此不必释放它们。您的foo
和foo2
函数返回指向已加载到内存中的预定义数据的指针以及程序代码。 (并且字符串文字存储在标记为只读的内存区域中,因此您应该使用char const *
以避免意外尝试修改其内容。)
答案 1 :(得分:0)
你必须明白,当你调用函数foo或foo2时,你在每次调用它们时都会创建和销毁你在这些函数中声明的变量。因此,如果你两次调用foo函数,你将打印出两个&#34; HELLO&#34;语句,逻辑过程将是这样的:
第一次调用foo函数:创建临时变量,返回tem变量,销毁temp变量,打印foo返回变量
第二次调用foo函数:创建临时变量,返回tem变量,销毁temp变量,打印foo返回变量
所以基本上每次调用函数时,每次都会创建和销毁里面的变量。