这会产生内存泄漏吗?

时间:2010-09-06 04:35:07

标签: c++ string memory-management memory-leaks

void aFunction_2()
{
    char* c = new char[10];
    c = "abcefgh";
}

问题:

  1. c = "abdefgh"是否会存储在new char[10]

  2. 如果c = "abcdefgh"是另一个内存区域我应该解除它吗?

  3. 如果我想将信息保存到char[10],我会使用strcpy之类的功能将信息放入char[10]吗?

5 个答案:

答案 0 :(得分:8)

是的,这是内存泄漏。

是的,您可以使用strcpy将字符串放入已分配的char数组中。

由于这是C ++代码,你不会做任何一个。你会使用std :: string。

答案 1 :(得分:6)

void aFunction_2()
{
    char* c = new char[10]; //OK
    c = "abcefgh";          //Error, use strcpy or preferably use std::string
}
  

1-请问:c =“abdefgh”是   分配内部新char [10]?

不,您正在将指针从先前指向10个字节的内存位置更改为指向新的常量字符串,从而导致10个字节的内存泄漏。

  

2-如果c =“abcdefgh”是另一个   记忆区域我应该解除它吗?

不,它还没有在堆上分配,它在只读内存中

  

3-如果我想在内心保存信息   char [10]我会使用像这样的函数   strcpy把信息放在内部   炭[10]?

不确定你对'内在'的意思。当你使用new分配时,内存在堆中分配,并且在正常情况下,如果提供指向内存块的指针,则可以从程序的任何部分访问。

答案 2 :(得分:0)

  1. 否(指针重新分配)
  2. 没有
  3. 是的,您可以使用strcpy(),请参阅for instance

答案 3 :(得分:0)

您的答案已经多次回答,但我认为所有答案都缺少一个重要的部分(您没有明确要求): 当你为十个字符分配内存然后覆盖了你引用这个内存区域的唯一指针时,就会产生一个你无法修复的内存泄漏。要做到这一点,你应该从内存的预分配的,预先初始化的常量部分std :: strcpy()内存,其中string-literal的内容已存储到动态分配的10个字符中。

这里有重要的部分:

完成处理这10个字符后,使用delete[] 解除分配。 []在这里非常重要。您使用new x[]分配的所有内容都必须使用delete[]取消分配。编译器和运行时都不会在使用普通delete时向您发出警告,因此记住此规则非常重要。

答案 4 :(得分:0)

  1. 不,那只是指针重新分配;
  2. 不,delete来自new的东西经常会崩溃;和
  3. 是的,strcpy将完成这项工作......但它通常不会在C ++中使用。
  4. 由于没有人回复代码,std::uninitialized_copy_n(或只是std::copy_n,这确实没有区别)是C ++比strcpy更多:

    #include <memory>
    
    static char const abcs[] = "abcdefgh"; // define string (static in local scope)
    char *c = new char[10]; // allocate
    std::copy_n( abcs, sizeof abcs, c ); // initialize (no need for strlen)
    
    // when you're done with c:
    delete[] c; // don't forget []
    

    当然,std::string是您应该使用的:

    #include <string>
    std::string c( "abcdefgh" ); // does allocate and copy for you
    // no need for delete when finished, that is automatic too!