堆栈破坏过程中的自动堆清理
|
int* f()
{
int *p = new int[10];
return p;
}
int main()
{
int *p = f();
//using p;
return 0;
}
确实是,在堆栈破坏期间,当函数返回其值时,某些编译器(在我被告知时隐含了诸如VS或gcc的常见编译器)可以尝试自动释放由本地指针(例如p)指向的内存吗?即使不是,我能否正常删除main中分配的[]内存?问题似乎在于,此时丢失了有关确切数组大小的信息。另外,在使用malloc和free的情况下,答案是否会改变?
谢谢。
没有找到相关结果
已邀请:
6 个回复
队辅坟阮阶
被“销毁”(已发布),但是
所指的不是“销毁了”(使用
发布)。 是的,您可以,并且应该/必须在主机上使用
。但这并不意味着在
中使用原始指针。您可能会发现此电子书很有趣:Link-Alf-Book 如果要对函数“超出”(超出范围)使用“ 6”表示局部变量指向的内容,请使用“ 7”(尽管仅适用于非数组变量,而不适用于需要“ 3”的变量) 另外,答案是否会改变 和免费的? 不,但是您应该确保不要混用
。
和
也一样。
死狸蔽垂藐
或
。它们只会释放指针本身占用的几个字节。我相信称为
或
的编译器将违反语言标准。 如果您指向存储器的指针(即
的结果),则只能在
中存储
。您不需要跟踪分配的大小;
和
在幕后为您做到了。 如果要在函数返回时清除内存,请使用智能指针,例如
或
(均来自Boost的库集合),
(在当前C ++标准中,但将不建议使用)或
(在即将到来的标准中) )。 在C语言中,不可能创建智能指针。
谷靛
即使不是,我能否正常删除main中分配的[]内存? 确保不需要时立即正确释放所有内存是正常的。 注意
和
不同,因此使用时请务必小心。 用
分配的存储器必须用
释放。 用
分配的存储器必须用
释放。 用
分配的存储器必须用
释放。 问题似乎在于,此时丢失了有关确切数组大小的信息。 记住此信息是运行时系统的问题。它的存储方式不是标准规定的,但是通常它与分配的对象很接近。 另外,在使用malloc和free的情况下,答案是否会改变? 在C ++中,您可能不应该使用malloc / free。但是可以使用。使用它们时,应将它们一起使用以确保不会泄漏内存。
街茬
氏脑
时,编译器会添加额外的簿记信息,以便它知道to3ѭ有多少个元素。 (以类似的方式,当您使用
时,它会知道
有多少字节。某些编译器库提供了扩展功能以找出该大小是多少。)
提孺局缎
如您所见,指向分配的内存的指针丢失了,编译器可以绝对确定地检测到该指针。