怎么样扩大new分配的内存?

happymoonfy 2005-04-07 08:39:22
请给出个例子,谢谢了。
int*p=new int[100];
我要使p指的空间变大,但不能改变原来空间中贮存的数据,C中可以用ralloc,在C++中怎么办?
有个思路,用new的定位操作,但不知道行不行也不知道怎么搞。
...全文
904 39 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
cssport2000 2005-04-09
  • 打赏
  • 举报
回复
同意tip9914(尖尖) 顶!
ysbcg 2005-04-09
  • 打赏
  • 举报
回复
呵呵 同意tip9914(尖尖) ,c++本来就有这个功能啊
不过效果和你自己重新申请然后copy一样(因为系统就是这么实现的)
tip9914 2005-04-09
  • 打赏
  • 举报
回复
回复人: happymoonfy(快乐精灵) ( ) 信誉:100 2005-4-8 18:29:34 得分: 0




回复人: tip9914(尖尖) ( ) 信誉:100


很简单的啊,显然用new placement了!
char* p=new int[100];
p=new(p) int[1000];
就这样啊,内存中数据都不会被改变

//-----------------------------------

这样行不行啊??有点怀疑。


----------------------------------------------------------------
当然可以了,不信自己试试就知道了,p的地址不会变的,是在原来的基础上又加上需要扩大的内存

MagicCarmack 2005-04-09
  • 打赏
  • 举报
回复
重新new一个
然后数据memcpy( )过去
并释放原来那个

可以用 vector来搞定!
lvjinhua 2005-04-09
  • 打赏
  • 举报
回复
又得1分,好可怜呀!
我相信申请新的空间,将旧内容拷入其中,再释放旧空间是即安全又可靠的方法!
Zark 2005-04-09
  • 打赏
  • 举报
回复
采用placment new对于你的程序来说是安全,如果你想确认它是新增的空间而不是重新分配的,比较p的值就可以了.

但是placment new失败的可能相对比较大,举例来说,在p前面的空间和p后面的空间都已经被占用的情况下,即使在其他地方仍为30字节以上的空间,placement new仍会失败,所以必须对p进行检查.

其实"re-new"也没有什么难的,不想楼上各位为什么齐声反对.例子如下:
#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
int nLen=20;
char * p=new char[nLen];
cin>>p;
cout<<p<<endl;

char* tmp=new char[30];
memmove(tmp,p,nLen);
delete []p;
p=tmp;

cout<<p<<endl;


....
delete []p;
return 0;
}
sapphirez 2005-04-08
  • 打赏
  • 举报
回复
我也曾经遇到这样的问题.也是没很好的办法解决.听说可以用Verctor类.但我刚学C++不久.对STL不太熟悉.楼主要是能解决的话.顺便告知一声.谢谢
lgsnake 2005-04-08
  • 打赏
  • 举报
回复
就是使用vector或者list之类的,自动管理,要好多有好多
happymoonfy 2005-04-08
  • 打赏
  • 举报
回复
顺便问一下,初始化一个很大的数组用什么方法?还用循环?全局的是自动初始化吗?
sharkabc 2005-04-08
  • 打赏
  • 举报
回复
vector list
Devillove 2005-04-08
  • 打赏
  • 举报
回复
you can use STL;
bluedodo 2005-04-08
  • 打赏
  • 举报
回复
关注
Beover1984 2005-04-08
  • 打赏
  • 举报
回复
我也同意几位说的,为什么不试试vector呢?
lvjinhua 2005-04-08
  • 打赏
  • 举报
回复
#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
char * p=new char[20];
cin>>p;
cout<<p<<endl;

p=new(p) char[30];
cout<<p<<endl;
return 0;
}

我试了,这样做可以,但不知道安全不,也不知道它是在以前的基础上增加呢还是重新分配30个空间???
junguo 2005-04-08
  • 打赏
  • 举报
回复

可以自己写自己的数组类,通过重载new来实现动态分配!
happymoonfy 2005-04-08
  • 打赏
  • 举报
回复

回复人: tip9914(尖尖) ( ) 信誉:100


很简单的啊,显然用new placement了!
char* p=new int[100];
p=new(p) int[1000];
就这样啊,内存中数据都不会被改变

//-----------------------------------

这样行不行啊??有点怀疑。
tip9914 2005-04-08
  • 打赏
  • 举报
回复
很简单的啊,显然用new placement了!
char* p=new int[100];
p=new(p) int[1000];
就这样啊,内存中数据都不会被改变
HUDIEGU 2005-04-08
  • 打赏
  • 举报
回复
学习~
jingyueid 2005-04-08
  • 打赏
  • 举报
回复
relloc 的做法也是堆上重新分配内存,然后使用memcpy()把源数据可拷贝过去。

下面的方法可以满足楼主的要求:
template< class DataPtr >
class Demo< DataPtr >
{
public:
Demo();
Demo( const Demo & );

~Demo(); /* 小心处理析构函数 */
/*
* 补充你自己的方法
*/

/*
- 当需要插入新项时
* relloc aIdxList数组,这里并不需要构造函数,
* 所以很安全.
* 分配一个DataPtr所指向的内存出来
* 并该内存的指针添入数组新增项内。
*/

int Insert( ... );
int Delete( ... );

private:
int nLength; /* the count */
DataPtr aIdxList; /* every entry will point to a DataPtr */
};
windwolfreal 2005-04-08
  • 打赏
  • 举报
回复
只能重新new一块内存 没办法的

要是想把内存缩小,倒是可以用new定位
比如:
char a[100];//原来的大小
CData* pdata;//你想用的东东, sizeof(data)<100
//则你可以分配在a上
pdata = new (a) CData();
//ok~
加载更多回复(19)

65,183

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧