如何在函数C ++中管理内存

时间:2014-12-10 13:59:52

标签: c++ function memory

如何在函数中管理内存,它返回动态分配的变量? 当函数返回时,缓冲区会发生什么?

char * getStr(){

    char * buffer = new char[12];
    sprintf_s(buffer, 12 , "abcdef");

    return buffer;
}

5 个答案:

答案 0 :(得分:2)

buffer保持分配,但幸运的是你正在返回指针。

必须 delete[]指针,否则你会泄漏内存。

注意我是如何使用[]的:这很重要。这平衡了char数组的分配。 (从概念上讲,运行时存储使用new something[]分配的数组的长度,delete[]通知运行时释放正确数量的元素。)

答案 1 :(得分:1)

当函数返回时,缓冲区仍然存在。没有什么比嵌入式内存管理器,你必须释放你手动分配的所有内存。这是关于C.

在C ++标准库中,有一些称为智能指针的对象。由于存在例外情况,因此完全建议使用它们。关于他们的问题有很好的答案:What is a smart pointer and when should I use one?

答案 2 :(得分:0)

没有

存储在*buffer中的地址将返回给调用者,并由调用者再次调用delete内存。

答案 3 :(得分:0)

buffer是一个指针,表示它处理内存中的一个点。

new将为命令new char[12]分配一块内存,它将分配12 char个内存。

new返回内存的地址,并分配给指针buffer

请注意,因为您只有指向内存的指针,所以需要在buffer超出范围之前清除它。如果缓冲区buffer中包含的地址超出范围,您将“泄露”内存。因为它无法回收。使用以下命令清除new char[12]分配的内存:delete[]

答案 4 :(得分:0)

感谢Bathsheba提供了他的answer

我对解决问题的看法:

char * getStr(){

    char * buffer = new char[12];
    sprintf_s(buffer, 12 , "abcdef");

    return buffer;
}

int _tmain(int argc, _TCHAR* argv[]){

    char * p = getStr();

    std::cout << p << std::endl;

    delete[] p;
    return 0;
}