一个存储分配问题

时间:2021-11-30 00:17:07
在c++中,我想实现这样一个问题
 char *p;
  p=new char (15);
 strcpy(p,"abcdefgefg");
 strcat(p,"eeeeeeeeeeeeeeeee");
这样肯定超出内存。但我又不知道怎么做。把15 该为更大的数 太浪费内存,我不想这么做。我想请问还有没有更好的做法。
在c中有realloc 可以增加已分配的存储块大小。但是new 和realloc  可以同时使用吗?
如果同时使用,那释放怎么办,delete 还是free;

11 个解决方案

#1


想不出还有什么方法。
new 只能和 delete匹配,new 和realloc 要避免同时使用,或者就不要使用realloc了,它不安全,c++只是为了兼容才允许用alloc 和 free.

#2


笼统来说,malloc和free是C风格的,new和delete是C++风格的,malloc和free(会产生问题的原因在于他们不知道构造函数和析构函数。关于详细讲解,可以参考effective C++条款3。
关于你的第一个问题,好像在你的例子里面,一开始申请大一点的空间浪费不了多少空间吧,除非你的内存少的可怜。如果非要实现,建议另申请一块空间存放连接以后的字符串,然后吧P释放掉,这样就不存在浪费空间的问题了。
我是这样想的,也许还有更好的方法。

#3


要方便实用用数组,要经济耐用用链表。

#4


先delete掉,再new一个更大的!

#5


但我想保留*p原来的内容啊.程序只是个例子。
我想问
   有没有可以既保留数据又能在此基础上增加数据的方法。
   内存不够,再动态增加内存。

#6


参考vector的设计方法吧。

#7


对了,要善用STL的容器组件,有好处。

字符串可以用string,数组用vector。

#8


自己编一个realloc


****************************************************

明天会怎样?

#9


只有用链表了

#10


STL的容器组件是一种现成的方法。

CString类在处理这种情况时也是使用,delete 再 new 

char *p;
表示字符串时,不可以使用链表的,
因为,所有的字符串为参数的函数,都是认为它指向的是连续的内存块,且是以NULL结尾的。

不要津津计较了,干大事的人应该不拘小节的。

在送你一句话,
滴水穿石,铁杵成针。你也可以把所有的相关函数重写!!!!

#11


TO fly_hyp(大鹏) :
 1、 "delete 再 new "
——还要有重新COPY先前数据的过程,个人认为这可能是最耗时的地方。

2、“表示字符串时,不可以使用链表的”
——用链表当然是可以的,比如下面的结构:
sturct Node
{
   char str[128];
   Node *next;
};
128不够了就new,有何不可。至于结束符'\0',和普通字串没有什么区别,当然用个变量专门保存其长度也未尝不可。

话又说回来,既然有STL,有String, 还是建议用现成的东东方便,当然你要想知道其原理(用new 和 delete, 可不是链表;链表方法仅供参考),我也很赞同自己把相关函数重写。

其它很同意 fly_hyp(大鹏) 的说法。

#1


想不出还有什么方法。
new 只能和 delete匹配,new 和realloc 要避免同时使用,或者就不要使用realloc了,它不安全,c++只是为了兼容才允许用alloc 和 free.

#2


笼统来说,malloc和free是C风格的,new和delete是C++风格的,malloc和free(会产生问题的原因在于他们不知道构造函数和析构函数。关于详细讲解,可以参考effective C++条款3。
关于你的第一个问题,好像在你的例子里面,一开始申请大一点的空间浪费不了多少空间吧,除非你的内存少的可怜。如果非要实现,建议另申请一块空间存放连接以后的字符串,然后吧P释放掉,这样就不存在浪费空间的问题了。
我是这样想的,也许还有更好的方法。

#3


要方便实用用数组,要经济耐用用链表。

#4


先delete掉,再new一个更大的!

#5


但我想保留*p原来的内容啊.程序只是个例子。
我想问
   有没有可以既保留数据又能在此基础上增加数据的方法。
   内存不够,再动态增加内存。

#6


参考vector的设计方法吧。

#7


对了,要善用STL的容器组件,有好处。

字符串可以用string,数组用vector。

#8


自己编一个realloc


****************************************************

明天会怎样?

#9


只有用链表了

#10


STL的容器组件是一种现成的方法。

CString类在处理这种情况时也是使用,delete 再 new 

char *p;
表示字符串时,不可以使用链表的,
因为,所有的字符串为参数的函数,都是认为它指向的是连续的内存块,且是以NULL结尾的。

不要津津计较了,干大事的人应该不拘小节的。

在送你一句话,
滴水穿石,铁杵成针。你也可以把所有的相关函数重写!!!!

#11


TO fly_hyp(大鹏) :
 1、 "delete 再 new "
——还要有重新COPY先前数据的过程,个人认为这可能是最耗时的地方。

2、“表示字符串时,不可以使用链表的”
——用链表当然是可以的,比如下面的结构:
sturct Node
{
   char str[128];
   Node *next;
};
128不够了就new,有何不可。至于结束符'\0',和普通字串没有什么区别,当然用个变量专门保存其长度也未尝不可。

话又说回来,既然有STL,有String, 还是建议用现成的东东方便,当然你要想知道其原理(用new 和 delete, 可不是链表;链表方法仅供参考),我也很赞同自己把相关函数重写。

其它很同意 fly_hyp(大鹏) 的说法。