none
new空间和直接赋值的区别 RRS feed

  • 问题

  • 代码:char *s = "fe";直接赋值

    char *s = NULL; s = new char[4]; s = "fe";new空间后再赋值,在大型程序中,他们可能分别导致什么问题呢。最好能说下一般什么情况下用第一种,什么情况下用第二中,才能最大的去避免程序产生的问题。
    2011年8月5日 2:05

答案

  • char *s = "fe";

    指向常量存储区

    char *s = NULL; s = new char[4]; 在堆上

    s = "fe"; 又指向了常量存储区。可怜的堆上内存泄漏了。。。

    第一种适合于定义一些在程序中不修改的变量,例如,读取config文件的内容。那些不变的字段。

    第二中适合于需要动态变化的内存。例如从socket中得到数据流。

    第一种性能贼快。空间在编译的时候已经确定了。不需要动态申请空间的时间。第二中,相对较慢,如果实行能敏感的系统,是要强烈控制的。并且容易造成内存泄漏。比如你的例子。。。

     


    麻烦把正确答案设为解答。
    2011年8月5日 2:47
    版主

全部回复

  • char *s = "fe";

    指向常量存储区

    char *s = NULL; s = new char[4]; 在堆上

    s = "fe"; 又指向了常量存储区。可怜的堆上内存泄漏了。。。

    第一种适合于定义一些在程序中不修改的变量,例如,读取config文件的内容。那些不变的字段。

    第二中适合于需要动态变化的内存。例如从socket中得到数据流。

    第一种性能贼快。空间在编译的时候已经确定了。不需要动态申请空间的时间。第二中,相对较慢,如果实行能敏感的系统,是要强烈控制的。并且容易造成内存泄漏。比如你的例子。。。

     


    麻烦把正确答案设为解答。
    2011年8月5日 2:47
    版主
  • 首先你得明确你要做什么。 你所列的两种方法并无不同,只是后者多了无用的new。 char *不是string,不要想着直接赋值就会拷贝到原先的内存。 在需要分配未知或指定大小的内存,或者需要进行写入的时候必须通过new之类方法来申请内存。 常量区其实也可以写入,但比如要1M内存时怎么办?
    rrrfff
    2011年8月5日 10:42