社区
C++ 语言
帖子详情
new 和delete的问题
mark521
2005-01-24 10:09:18
有一个结构体
struct mark//是全局变量
{
int i;
float j;
};
在一个FOR循环有
for(int ii =0;ii<x;ii++)//其中X也是一个变量
{
mark *mymark = new mark;
}
那在要把所有*mymark给delete,怎么做呢?
用delete *mymark;可以把所以开辟的内存区全部FREE掉嘛?
...全文
393
25
打赏
收藏
new 和delete的问题
有一个结构体 struct mark//是全局变量 { int i; float j; }; 在一个FOR循环有 for(int ii =0;ii<x;ii++)//其中X也是一个变量 { mark *mymark = new mark; } 那在要把所有*mymark给delete,怎么做呢? 用delete *mymark;可以把所以开辟的内存区全部FREE掉嘛?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
25 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
mark521
2005-01-24
打赏
举报
回复
但是我现在都是做成指针的,要程序的化,就要改一片,我如果用这个方法
struct mark//是全局变量
{
int i;
float j;
};
vector<mark*> vecMark;
for(int ii =0;ii<x;ii++)//其中X也是一个变量
{
mark *mymark = new mark;
vecMark.push_back(mymark);
}
//然后依次释放弹出
释放用用如下代码是否可以
int size = vecMark.size();
for(ii = 0;ii<size;++ii)
{
delete vecMark.at(ii);
}
最后的这个循环能否将我NEW出来的内存区给释放掉呢
blueskyzsz
2005-01-24
打赏
举报
回复
vecMark.clear();
// 如果你这么用了 vector<mark> vecMark;
// vecMark 保证释放分配出来的内存,也就是说你不用管释放问题
// 当vecMark 出了作用域就会自动释放所有的内存
mark521
2005-01-24
打赏
举报
回复
这里MARK是一个结构体啊, blueskyzsz(青禾)说,通过CLEAR可以自动调用mark的析构函数,那么它是否也自动的将NEW 出来的结构体指针对应的内存给释放掉呢
blueskyzsz
2005-01-24
打赏
举报
回复
不过对于一些复杂的class最好用 goodluckyxl(被人遗忘的狗) 的方法
保存指针
blueskyzsz
2005-01-24
打赏
举报
回复
其实VECTOR 本身的内存就是NEW 来得,只不过我们看不到而已,所以
vector<mark> vecMark;
for(int ii =0;ii<x;ii++)//其中X也是一个变量
{
mark markTemp;
vecMark.push_back(markTemp); // 这个内容实质上是放在了堆中 是由vector 的内存分配器分配的
}
// 所以只要你的vecMark 在作用域内有效 这个 vecMark中的内容就有效
// 而且这么做在调用 vecMark.clear() 删除整个vecMark内容时 可以自动调用mark的析构函数
goodluckyxl
2005-01-24
打赏
举报
回复
blueskyzsz(青禾)
我没说清楚
我的意思是 对于一些情况
你的用法会有问题
shenailin
2005-01-24
打赏
举报
回复
呵呵, 这样也可以, 最好别这样用哦 !
mark *pMark = mymark
for(int ii =0;ii<x;ii++)//其中X也是一个变量
{
pMark = mymark ;
delete mymark;
mymark = (pMark--);
}
blueskyzsz
2005-01-24
打赏
举报
回复
goodluckyxl(被人遗忘的狗)
呵呵,不可能,如果我的这个内容除了函数无效,那么你的那个保存指针的,除了函数体
指针一样无效
mark521
2005-01-24
打赏
举报
回复
不是的我现在一定要通过NEW来新开辟内存区,所以一定要DELETE,不过也正好用到了VECTOR,问问象我上面的做法可以将开辟的内存释放掉了嘛
goodluckyxl
2005-01-24
打赏
举报
回复
楼上的这样是不可取的
如果在一个函数体中这么做
那么在整个这个当前函数中容器内容是有效的
出了函数体,就会被销毁
blueskyzsz
2005-01-24
打赏
举报
回复
// 对于你的这个结构,这么做就可以了,不要用vector保存指针,
vector<mark> vecMark;
for(int ii =0;ii<x;ii++)//其中X也是一个变量
{
mark markTemp;
vecMark.push_back(markTemp)
}
// 不用的时候
vecMark.clear();
mark521
2005-01-24
打赏
举报
回复
vector<mark*> vecMark;
for(int ii =0;ii<x;ii++)//其中X也是一个变量
{
mark *mymark = new mark;
vecMark.push_back(mymark);
}
//然后依次释放弹出
释放用用如下代码是否可以
int size = vecMark.size();
for(ii = 0;ii<size;++ii)
{
delete vecMark.at(ii);
}
大侠们看看,可以否
hxblvc
2005-01-24
打赏
举报
回复
for(int ii =0;ii<x;ii++)//其中X也是一个变量
{
mark *mymark = new mark; //mymark ---在这里是局部变量,
//离开for的"}"之后,控制权就不是你的了
//这样做申请的内存没有释放
}
jjcheung
2005-01-24
打赏
举报
回复
snow810211(阳光) 的大有问题。
const int SIZE = 10;
mark * Ptr[SIZE];
for(int ii =0;ii<x;ii++)//其中X也是一个变量
{
//mark *mymark = new mark;
Ptr[ii] = new mark; //这里是不是应该这样。
}
//这里Ptr绝对不能用delete[]的
//delete []Ptr ; //这样就成了吧!(不确信)
//如果要释放,要
for(ii =0;ii<x;ii++)//其中X也是一个变量
{
delete Ptr[ii];
Ptr[ii] = NULL; //对于释放的指针,最好释放完后立即清0。
}
goodluckyxl
2005-01-24
打赏
举报
回复
mark521()
此时所有的对象指针保存在了容器中
一旦释放其中一个
标志对应容器中的一个指针同样无效
captainivy
2005-01-24
打赏
举报
回复
定义结构数组是常用的方法
用vector也很方便
释放后,肯定没有了阿
呵呵
mark521
2005-01-24
打赏
举报
回复
用了goodluckyxl(被人遗忘的狗)的 方法,但是释放调后,再通过VIECTOR调用mymark的时候,里面的东东就没有了啊
goodluckyxl
2005-01-24
打赏
举报
回复
vector<mark*> vecMark;
for(int ii =0;ii<x;ii++)//其中X也是一个变量
{
mark *mymark = new mark;
vecMark.push_back(mymark);
}
//然后依次释放弹出
mark521
2005-01-24
打赏
举报
回复
如果是在一个函数下 mark *mymark = new mark;
函数结束的时候是否就会自动释放内存呢
pcboyxhy
2005-01-24
打赏
举报
回复
还不如一次性分配空间
或者保留分配的信息
加载更多回复(5)
new
和
delete
用法详解
本篇文章对C++中的
new
和
delete
进行详解。在讲解
new
和
delete
时,我们会对比C语言中的malloc和free,看看两者的区别和相似之点。希望本篇文章会对你有所帮助
new
/
delete
详解(跑路人笔记)<C++初阶>
文章目录前言
new
/
delete
内置类型举例自定义类型举例
new
失败operator
new
与operator
delete
现式调用构造函数
new
和
delete
的实现原理malloc/free和
new
/
delete
的区别小结 前言
new
和
delete
是C++为了类的使用方便而创造的操作符,我们在使用C++时应该尽量避免使用malloc和free而应该转向使用
new
和
delete
.
new
/
delete
内置类型举例
new
/
delete
类似于malloc/free但是为了搭配我们的C++的新知识也就是类的
C++入门——
new
和
delete
C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过
new
和
delete
操作符进行动态内存管理。对自定义类型A
new
和 malloc最大区别是
new
对于【自定义类型】除了开空间还会调用构造函数
delete
和free最大区别是
delete
对于【自定义类型】除了释放空间还会调用析构函数class Apublic:: _a(a)~A()private:int _a;int main()//动态申请。
new
和
delete
的使用
1
new
和
delete
的使用
new
其实就是告诉计算机开辟一段新的空间,但是和一般的声明不同的是,
new
开辟的空间在堆上,而一般声明的变量存放在栈上。 通常来说,当在局部函数中
new
出一段新的空间,该段空间在局部函数调用结束后仍然能够使用,可以用来向主函数传递参数。另外需要注意的是,
new
的使用格式,
new
出来的是一段空间的首地址。所以一般需要用指针来存放这段地址。 例如 int *p=
new
int(5); 而且使用
new
开辟堆空间后,需要再使用
delete
释放空间,不然会造成内存泄露。
200-详解C++的
new
和
delete
1、深入理解
new
和
delete
new
和
delete
称作运算符 我们转反汇编看看: 这2个运算符本质也是相应的运算符的重载的调用 1、malloc按字节开辟内存的;
new
开辟内存时需要指定类型
new
int[10] 所以malloc开辟内存返回的都是void* 而
new
相当于运算符的重载函数 operator
new
->返回值自动转成指定的类指针 int* 2、malloc只负责开辟空间,
new
不仅仅有malloc的功能,可以进行数据的初始化
new
int(20);//初始化2
C++ 语言
65,187
社区成员
250,526
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章