社区
C++ 语言
帖子详情
怎么样扩大new分配的内存?
happymoonfy
2005-04-07 08:39:22
请给出个例子,谢谢了。
int*p=new int[100];
我要使p指的空间变大,但不能改变原来空间中贮存的数据,C中可以用ralloc,在C++中怎么办?
有个思路,用new的定位操作,但不知道行不行也不知道怎么搞。
...全文
998
39
打赏
收藏
怎么样扩大new分配的内存?
请给出个例子,谢谢了。 int*p=new int[100]; 我要使p指的空间变大,但不能改变原来空间中贮存的数据,C中可以用ralloc,在C++中怎么办? 有个思路,用new的定位操作,但不知道行不行也不知道怎么搞。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
c++编程一定要注意变量作用域
本文探讨了在使用
new
()或calloc()
分配
内存
后遇到的指针为空的问题。解析了指针生命周期结束导致
内存
被释放的原因,并提供了两种解决策略:一是通过
扩大
指针作用域来避免生命周期结束;二是将指针定义为全局变量。
c/c++中free(): invalid pointer,corrupted double-linked list, corrupted size vs. prev_size等的解决办法
本文探讨了编程中常见的
内存
问题,90%的
内存
错误源于
内存
越界。文章介绍了四种罕见的
内存
错误类型,如free()的invalidpointer等,这些错误通常在程序结束时出现,排查困难。作者建议检查
new
分配
的数组边界,使用ulimit
扩大
栈大小或改用malloc,以及通过肉眼判断可能的越界行为。
chkstk stack overflow 解决方案
本文介绍了一个VC6编译程序在运行时遇到Stack Overflow异常的问题,并提供了两种解决方案:一是通过Link Option增加/stack:参数来
扩大
堆栈大小;二是改用
new
关键字从堆上动态
分配
内存
。
Stack overflow与VC stack size参数/stack:
本文探讨了使用VC6编译器时遇到的Stack Overflow问题,详细分析了错误原因,即局部变量过大导致栈溢出,并提供了两种解决方案:一是通过增加link option中的/stack参数来
扩大
栈空间;二是改为使用
new
从堆上动态
分配
内存
。
C++ | 动态
分配
内存
new
和malloc的区别
本文介绍了C++中的动态
内存
分配
,包括静态
分配
内存
的概念和动态
分配
内存
的两种方式——
new
和delete。重点讨论了
new
和malloc的区别,如
new
关键字支持对象构造,而malloc不支持;
new
失败会抛出异常,malloc则返回NULL。此外,还提及了
内存
管理中的
内存
扩充问题,
new
缺乏像realloc那样的直接扩展功能。
C++ 语言
65,211
社区成员
250,516
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章