堆栈破坏过程中的自动堆清理

|
int* f()
{
    int *p = new int[10];
    return p;
}

int main()
{
    int *p = f();
    //using p;
    return 0;
}
确实是,在堆栈破坏期间,当函数返回其值时,某些编译器(在我被告知时隐含了诸如VS或gcc的常见编译器)可以尝试自动释放由本地指针(例如p)指向的内存吗?即使不是,我能否正常删除main中分配的[]内存?问题似乎在于,此时丢失了有关确切数组大小的信息。另外,在使用malloc和free的情况下,答案是否会改变? 谢谢。     
已邀请:
只有局部变量被销毁释放。 在您的情况下,
p
被“销毁”(已发布),但是
p
所指的不是“销毁了”(使用
delete[]
发布)。 是的,您可以,并且应该/必须在主机上使用
delete[]
。但这并不意味着在
C++
中使用原始指针。您可能会发现此电子书很有趣:Link-Alf-Book 如果要对函数“超出”(超出范围)使用“ 6”表示局部变量指向的内容,请使用“ 7”(尽管仅适用于非数组变量,而不适用于需要“ 3”的变量)   另外,答案是否会改变   和免费的? 不,但是您应该确保不要混用
free()/new/delete/malloc()
new/delete[]
new[]/delete
也一样。     
不,它们不会是您的指针指向的
free
delete
。它们只会释放指针本身占用的几个字节。我相信称为
free
delete
的编译器将违反语言标准。 如果您指向存储器的指针(即
f()
的结果),则只能在
main
中存储
delete[]
。您不需要跟踪分配的大小;
new
malloc
在幕后为您做到了。 如果要在函数返回时清除内存,请使用智能指针,例如
boost::scoped_ptr
boost::scoped_array
(均来自Boost的库集合),
std::auto_ptr
(在当前C ++标准中,但将不建议使用)或
std::unique_ptr
(在即将到来的标准中) )。 在C语言中,不可能创建智能指针。     
  确实是,在堆栈破坏期间,当函数返回其值时,某些编译器(在我被告知时隐含了诸如VS或gcc的常见编译器)可以尝试自动释放由本地指针(例如p)指向的内存吗? 简短答案:否 长答案: 如果您正在使用智能指针或容器(应该如此),则可以。 当智能指针超出范围时,将释放内存。
std::auto_ptr<int> f()
{
    int *p = new int;
    return p; // smart pointer credated here and returned.
              // p should probably have been a smart pointer to start with
              // But feeling lazy this morning.
}

std::vector<int> f1()
{
    // If you want to allocate an array use a std::vector (or std::array from C++0x)
    return std::vector<int>(10);
}

int main()
{
    std::auto_ptr<int> p = f();
    std::vector<int>   p1 = f1();

    //using p;
    return 0;  // p destroyed
}
  即使不是,我能否正常删除main中分配的[]内存? 确保不需要时立即正确释放所有内存是正常的。 注意
delete []
delete
不同,因此使用时请务必小心。 用
new
分配的存储器必须用
delete
释放。 用
new []
分配的存储器必须用
delete []
释放。 用
malloc/calloc/realloc
分配的存储器必须用
free
释放。   问题似乎在于,此时丢失了有关确切数组大小的信息。 记住此信息是运行时系统的问题。它的存储方式不是标准规定的,但是通常它与分配的对象很接近。   另外,在使用malloc和free的情况下,答案是否会改变? 在C ++中,您可能不应该使用malloc / free。但是可以使用。使用它们时,应将它们一起使用以确保不会泄漏内存。     
您被误导了-清除了局部变量,但没有分配给局部指针的内存。如果不返回指针,则会立即发生内存泄漏。 不必担心编译器如何跟踪分配了多少个元素,这是C ++标准未解决的实现细节。只是知道它有效。 (只要您使用的是ѭ3ation表示法)     
当您使用
new[]
时,编译器会添加额外的簿记信息,以便它知道to3ѭ有多少个元素。 (以类似的方式,当您使用
malloc
时,它会知道
free
有多少字节。某些编译器库提供了扩展功能以找出该大小是多少。)     
我还没有听说过编译器会这样做,但是编译器肯定有可能检测(在许多情况下)该函数分配的内存是否不再被指针引用,然后释放该内存。记忆。 但是,就您而言,内存不会丢失,因为您保留了指向它的指针,该指针是函数的返回值。 这段代码最常见的情况是发生内存泄漏,并且非常适合使用此功能:
int *f()
{
    int *p = new int[10];
    // do something that doesn\'t pass p to external
    // functions or assign p to global data
    return p;
}

int main()
{
    while (1) {
      f();
    }
    return 0;
}
如您所见,指向分配的内存的指针丢失了,编译器可以绝对确定地检测到该指针。     

要回复问题请先登录注册