社区
C++ 语言
帖子详情
一个很重要的问题--100分
My_QQ
2004-09-16 10:04:31
大家可能经常遇到这样的情况
T* p=new T[100000];
如果Delete p当然没问题
但我想只删除其中的一个时该如何办那
因为我不想一个一个的NEW
数据量大,太慢拉!!!
...全文
462
47
打赏
收藏
一个很重要的问题--100分
大家可能经常遇到这样的情况 T* p=new T[100000]; 如果Delete p当然没问题 但我想只删除其中的一个时该如何办那 因为我不想一个一个的NEW 数据量大,太慢拉!!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
47 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
cpunion
2004-09-16
打赏
举报
回复
当然是可以解决的,实际上你提到的是一个内存池的概念,一般用来解决数量比较多的小对象的连续分配,这要用到placement new,以下代码仅供参考:
#include <iostream>
#include <string>
using namespace std;
class Test
{
string str;
public:
Test (int n){char buf[20]; snprintf (buf, 20, "%d", n); str = buf; cout << "ctor:" << str << "\t";}
~Test () {cout << "dtor:" << str << "\t";}
};
Test的构造函数接受一个整数,主要是用来输出,也可以用来测试。
int main ()
{
int SIZE = 10000;
void* array = operator new[](SIZE * sizeof(Test)); //分配内存
Test* testArray = static_cast<Test*>(array); //强制转换,
for (int i=50; i<100; i++)
{
new (&testArray[i]) Test(i); //placement new,译成什么我也不知道,实际上就是在已有的堆内存上构造对象,后面的Test(i)是调用构造函数。
}
for (int j=99; j>=70; j--)
{
testArray[j].~Test(); // 因为内存是一起分配的,你无法调用delete来删除某一个,只可以析构。如果调用delete,后果无法预知。
}
//我分成2段循环,是让你看到我以不同的顺序来析构对象,并没有影响到什么。
for (int k=50; k<70; k++)
{
testArray[k].~Test();
}
operator delete[](array); //释放内存
return 0;
}
上面我分配了可以容纳10000个Test的内存,实际上只使用了其中的50个。
testArray[k].~Test();也可以写成testArray[k].Test::~Test();
brucegong
2004-09-16
打赏
举报
回复
kao
伤自尊了……我习惯用free……
My_QQ
2004-09-16
打赏
举报
回复
1
关于堆的管理,系统在背后做了很多工作,是它在浪费内存,
你可以查查资料
2
p =new T[];
for( i=0;i < 1 ; ++i )
{
delete p++;
}
时,你的内存应该已经没有了
3 大家有办法的就多多指教,不知道的也多想想
不要把话题扯远了
umbrella1984
2004-09-16
打赏
举报
回复
我定义了一个二维数组,怎么循环显示数组值?
for(int ii=0;ii<20;ii++){
a[ii]=new int[ii];
}
for(int iii=0;iii<2;iii++){
for(int iiii=0;iiii<20;iiii++){
cout<<*a[iiii]<<endl;
nicknide
2004-09-16
打赏
举报
回复
freshairfly(菜鸟精神):
brucegong(飞行猪)
为什么不给每一个指针设置一个标志?
----------------------------
我当然知道这个问题可以解决。
首先,飞行猪啊,你都已经把那个地方删除了,然后还去访问,有可能产生非法访问啊(操作系统把那个空页给回收了,你访问就得到一个致命的调页失败错误,如果没有用SEH,直接程序就DOWN了……
菜鸟精神啊,你还要有认真精神才好,也要想一想再说嘛……
freefalcon
2004-09-16
打赏
举报
回复
楼主先说清楚需求
为何要一次new这么多对象
为何又要在某个时刻删除一个
freshairfly
2004-09-16
打赏
举报
回复
而且我要尽量减少内存的使用,
一个一个的NEW时,在堆里事实上浪费了好多字节的RAM啊
-----------------------------------
一起new就不会浪费内存了吗?
daylove
2004-09-16
打赏
举报
回复
好象是有点不对,
那个:for( i=0;i < 10000 ; ++i )
{
delete p++;
}
这里可以一个个删除吗?不明白,
楼主也没有必要指定删除某个啊,等你最后不用时,整个delete [] p;不就可以了???
freshairfly
2004-09-16
打赏
举报
回复
for(i = 0; i < 100000; ++i)
{
delete p++;
}
有问题啊!!想想吧!
---------------------------
有什么问题就说出来,不要装作很高深的样子!!
还有你到底要问的什么问题,怎么一会儿“只删除其中的一个”
一会儿“FOR()要一个一个的NEW,太慢了”
麻烦说清楚,OK?
freshairfly
2004-09-16
打赏
举报
回复
brucegong(飞行猪)
为什么不给每一个指针设置一个标志?
----------------------------
我当然知道这个问题可以解决。
darkstar21cn
2004-09-16
打赏
举报
回复
for(i = 0; i < 100000; ++i)
{
delete p++;
}
是错误的
freshairfly
2004-09-16
打赏
举报
回复
T* p=new T[100000];
delete[] p;
for(i = 0; i < 100000; ++i)
{
delete p++;
}
这里有问题吧?上面已经delete[] p;了怎么下面还delete p++;?
-----------------------------------------------------------------
我的意思是两种delete方法。楼主说需要只delete一部分,第二种方法就可以
umbrella1984
2004-09-16
打赏
举报
回复
T* p=new T[100000];
delete[] p;
for(i = 0; i < 100000; ++i)
{
delete p++;
}
这里有问题吧?上面已经delete[] p;了怎么下面还delete p++;?
My_QQ
2004-09-16
打赏
举报
回复
好,你有好办法,
多多指教!
brucegong
2004-09-16
打赏
举报
回复
在一个那么在意内存的系统里面还用常规方式来new delete??
奢侈
内存紧张的系统都是自己管理内存的,根本不是用new delete
brucegong
2004-09-16
打赏
举报
回复
freshairfly(菜鸟精神)
为什么不给每一个指针设置一个标志?
struct Point_Struct
{
BOOL bUse;
T* pPointer;
};
struct Point_Struct p[10000];
for()
{
...
p[i].bUse = TRUE;
...
}
delete的时候置为false或者……或者将指针置空……总之方法太多了
程序员是无所不能的
My_QQ
2004-09-16
打赏
举报
回复
for(i = 0; i < 100000; ++i)
{
delete p++;
}
有问题啊!!想想吧!
My_QQ
2004-09-16
打赏
举报
回复
而且我要尽量减少内存的使用,
一个一个的NEW时,在堆里事实上浪费了好多字节的RAM啊
My_QQ
2004-09-16
打赏
举报
回复
朋友,我不是说了,FOR()要一个一个的NEW,太慢了
我连续NEW 400000个30BYTE 的类时,程序就没反映了
指针的指针还可以考虑
freshairfly
2004-09-16
打赏
举报
回复
T* p=new T[100000];
delete[] p;
for(i = 0; i < 100000; ++i)
{
delete p++;
}
我觉得这样可以delete them one by one
不过如果你选中几个删除后,以后你就不知道哪几个被删除了。
加载更多回复(27)
yudao-boot-mini-Spring Boot 后台管理系统资源
RuoYi-Vue Pro Spring Boot + MyBatis Plus + Vue & Element + RBAC SaaS Flowable CRMERPAI Star
从平台建而不用、用而不活到知识管理效能提升,产业园区借助“上云用数赋智”一体化服务能实现多大跨越?.docx
科易网AI+成果转化与科技创新,以科创知识图谱、数智应用和智能体为人工智能商业化应用产品,聚焦技术转移、成果转化、科技创新、产业创新等方向,构建科技创新服务平台,为提升各类创新主体科技创新水平与地方产业创新效能提供解决方案。
SolidWorks图纸模板
源码下载地址: https://pan.quark.cn/s/a4b39357ea24 SolidWorks是一款在机械设计领域得到广泛应用的计算机辅助设计(CAD)软件,它具备功能强大的三维建模工具、完善的工程图功能以及多样化的设计协作功能。在工程图模板方面,SolidWorks为设计师们提供了创建符合行业标准图纸的便捷途径,从而显著提升了设计工作的效率。标题"SolidWorks工程图模板"具体指的是在SolidWorks软件中预先设定好的图框与标题栏组合布局,这些模板通常依据特定的规范(例如ISO、ANSI等)进行配置,涵盖了设计者通常所需的所有基本要素。借助这些模板,用户能够直接展开工程图的绘制工作,无需独立设置图框和标题栏,因而有效节省了大量的时间。描述中所指出的"已配置好图框和标题栏",表明这些模板已具备绘制工程图的基础结构。图框作为工程图的
一个
核心组成部
分
,它界定了图纸的范围,并且通常包含了图纸编号、日期、比例等关键信息。标题栏则是用于呈现设计详细信息的区域,例如设计者的姓名、零件的名称、材料种类、版本号等。一旦这些要素被配置妥当,设计师便可以根据具体的项目需求填充相应内容,从而迅速生成专业且标准化的工程图纸。"配置好存储路径后即可使用"这一说明表明,在使用SolidWorks工程图模板之前,用户必须先设定
一个
保存位置,这样每次创建新的工程图时,软件会自动将文件保存在这个指定的路径下,便于后续的管理和检索。压缩包内包含的文件"A3零件.DRWDOT"与"A3零件.slddrt"代表了SolidWorks的两种不同类型的工程图文件。".DRWDOT"文件是工程图模板文件,它集成了图框、标题栏及其他个性化设置,供用户在创建新工程图时选用。".slddr...
基于CNN-Agent Attention(代理注意力机制)-BiGRU的多变量时间序列预测研究(Python代码实现)
基于CNN-Agent Attention(代理注意力机制)-BiGRU的多变量时间序列预测研究(Python代码实现)
【地理信息系统】基于Earth Engine的几何解析服务:支持点坐标、Shapefile与GADM区域的数据转换工具设计
内容概要:本文介绍了
一个
名为GeometryService的类,旨在将不同类型的地理空间数据(如点坐标、Shapefile文件、GADM行政区划数据)解析并转换为Google Earth Engine可识别的几何对象(ee.Geometry)。该服务支持三种输入类型:通过经纬度字典创建点几何体、读取本地矢量文件(如Shapefile或GeoJSON)以及调用pygadm库获取全球行政区划数据。每种类型均有专门的解析方法,内部实现了坐标系统一(WGS84)、几何合并与GeoJSON格式转换,并最终封装为Earth Engine兼容的几何结构用于遥感
分
析或区域提取。; 适合人群:具备Python编程基础,熟悉地理信息系统(GIS)数据处理的科研人员或开发者,尤其是需要将本地或全球地理数据接入Google Earth Engine平台进行遥感
分
析的技术人员; 使用场景及目标:①将野外采样点、研究区边界等地理数据快速导入Earth Engine进行遥感影像
分
析;②利用GADM全球行政区划数据库动态获取国家或省级行政边界的几何对象,实现自动化区域统计;③为构建基于Web的地图
分
析工具提供后端几何解析支持; 阅读建议:使用前需安装geopandas、pygadm、earthengine-api等依赖库,注意处理异常情况如文件路径错误、坐标系不匹配或网络请求失败,建议结合实际数据调试各解析函数。
C++ 语言
65,210
社区成员
250,518
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章