c++the new ipad问题的问题求教

共有 1330 人关注过本帖
标题:关于c++中new 和 delete的问题
等 级:论坛游民
帖 子:47
专家分:31
结帖率:37.5%
&&已结贴√
&&问题点数:10&&回复次数:14&&&
关于c++中new 和 delete的问题
&&&我们都知道用new可以在堆中为程序开辟空间,但是如果程序在结束之前未对new开辟的空间用delete删除,是否可以啊??程序结束运行时是不是自动把new开辟的空间释放了??
&&&那位高手帮忙解答一下!!
搜索更多相关主题的帖子:
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
delete应该理解为释放,
不释放可以 但是很危险!
来 自:未来
等 级:蜘蛛侠
帖 子:353
专家分:1166
&&& 在程序中用到NEW分配内存空间时,运行结束得 时候一定要用delete来释放分配的内存空间,如果你不释放得话系统的内存将会减少,一两个程序这么做可能没有什么,但是如果所以得程序都这么干得话,那就有得玩咯。内存时及其宝贵得资源啊。我们不能有借不还啊。。。(我想在你下次开机的时候那内存应该回来了吧,我个人想的哦,错了大家指正一下哈哈)
翱翔天空的雄鹰固然令人羡慕,却容易被禁锢于牢笼之中,只有那夜色中的蝙蝠才是真正自由的飞翔者....
等 级:蜘蛛侠
帖 子:250
专家分:1150
以下是引用ltyjyufo在 15:39:00的发言:
&&& 在程序中用到NEW分配内存空间时,运行结束得 时候一定要用delete来释放分配的内存空间,如果你不释放得话系统的内存将会减少,一两个程序这么做可能没有什么,但是如果所以得程序都这么干得话,那就有得玩咯。内 ...程序结束后自动释放
等 级:论坛游侠
帖 子:80
专家分:136
4楼说的对啊
等 级:论坛游民
帖 子:40
专家分:60
应该是程序结束的时候会自动释放,但是如果你的程序比较大的话,那就有的玩了。
来 自:三体星系
等 级:贵宾
威 望:22
帖 子:500
专家分:1607
new出来的空间一直会保留到delete或者程序结束。
如果new出来的空间比较大,用完后不delete,那么n个new之后,你会发现内存空间不够用了,严重的会导致系统奔溃。
来 自:未来
等 级:蜘蛛侠
帖 子:353
专家分:1166
&&&&&& 如果程序结束后会自动释放的话,那要delete来做什么????????我觉得系统在没有关机之前是收不回分配出去的内存的(不用delete释放的话),只有在下次开机(或重起)的时候系统才能够收回。
翱翔天空的雄鹰固然令人羡慕,却容易被禁锢于牢笼之中,只有那夜色中的蝙蝠才是真正自由的飞翔者....
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
用delete这是一个习惯&&程序结束后 内存就将释放 啥都没了 !
等 级:小飞侠
帖 子:597
专家分:2452
回复 8楼 ltyjyufo
这个跟操作系统有关系,在XP里,你没用delete去释放,程度结束了,系统也会把那些内存回收回去。自己写段代码再调出资源管理器察看验证下。
迭代的是人,递归的是神。
版权所有,并保留所有权利。
Powered by , Processed in 0.041307 second(s), 8 queries.
Copyright&, BCCN.NET, All Rights Reserved今天看啥 热点:
求变量的数据类型,typeid,bool,C和C++的不同,new和delete,C++中的枚举,inline和可变参数模板,auto和函数模板,宽字符
求变量的数据类型,通过函数typeid(变量名).name();获得变量的数据类型。
案例如下:
db = 10.9;
double *pdb
//通过typeid的方式获得数据类型
<< typeid(db).name()
<< typeid(num).name()
<< typeid(pdb).name()
//typeid(db).name() db2
//decltype用于查询表达式的数据类型(Declared Type)
decltype(db)
numA(10.8);
<< sizeof(numA)
system("pause");
运行结果如下:
2.bool类型vcD4KCjxwIGFsaWduPQ=="left">#include
b1 = (1 && 1) || 2 || (-1 && 0);
<< typeid(b1).name()
decltype(b1)
bt(1 &#43; 2 * 3 - 4 && 3 &#43; 2 || -1);
<< typeid(bt).name()
system("pause");
3.C&#43;&#43;中不同的细节
//C&#43;&#43;全局变量没有声明与定义的差别
//静态全局变量也没有声明与定义的差别
//C&#43;&#43;是强类型系统,函数返回&#20540;必须要有类型
不能重复定义a
不能重复定义b
//C&#43;&#43;编译器 编译的宽泛
//为了修改源代码,后面留下拓展
//占位,占位参数
//C&#43;&#43;检测到右&#20540;在存有实体,自动转换为左&#20540;
//C语言不会把右&#20540;转换为左&#20540;
(a = 3) = 4;
(&#43;&#43;a)&#43;&#43;;
//register C&#43;&#43;编译器做了优化,检测到取地址,就不会把它放到寄存器
//register
可以取地址
<< &num <<
test(1, 2.9, 3);
system("pause");
A:用了delete之后,最好使用使用p
//防止重复删除
system("pause");
delete只能delete一次,案例如下:
num = 10;//栈上
p;//只能释放一次
system("pause");
错误截图如下:
修改后的状态
delete删除数组元素的时候,要加上[],案例如下:
//int num[110]
//下面定义int i = 0的循环方式C99标准支持
i < 10;i&#43;&#43;)
delete[]p;
//删除数组的空间
system("pause");
截图如下:
删除对象数组的案例如下:
tansheng()//构建的时候初始化
<< "谭胜被创建"
~tansheng()//删除的时候释放内存
<< "谭胜被销毁"
tansheng *p
p;//基本数据类型,delete,复杂类型必须加上[]
system("pause");
tansheng()
//构建的时候初始化
<< "谭胜被创建"
~tansheng()
//删除的时候放内存
<< "谭胜被销毁"
void * operator new(size_t
jishuqi &#43;= 1;
<< "对象被创建"
tansheng *ptemp
void operator delete(void
jishuqi -= 1;
<< "对象被销毁"
tansheng::jishuqi
//类的内部的new没有完成分配内存的动作
//通往全局的new中间做了一个劫持
//空类占一个字节,表示自己存在
//类的对象,数据是独立,代码是共享的
//没有分配内存,构造函数无意义
MyClass();
~MyClass();
MyClass::~MyClass()
tansheng *p1
tansheng *p2
tansheng *p3
tansheng *p4
<< tansheng::jishuqi
<< "myclass size" <<
sizeof(MyClass)
system("pause");
结果如下:
5.枚举类型
color :char{
//mycolor = 'A'; //确保在枚举的范围的之内不出错
color:://新语法
mycolor1(red);
mycolor2(color::red);
printf("%d,%c\n",
printf("%d,%c\n",
system("pause");
6.两个大数的字符串求乘
_CRT_SECURE_NO_WARNINGS
//除了数据还有函数
bigdatacom
protected://内部私有
dataa[100];
datab[100];
public://共有公开
init(const
char *str1,
char *str2)
<< typeid(*this).name()
strcpy(this->dataa,
strcpy(this->datab,
char *getbigdata()
strlen(dataa);
strlen(datab);
//两个数相乘,乘得到的位数不可能大于两个数的位数之和
= (int *)malloc(sizeof(int)*(lengtha
&#43; lengthb));
memset(pres,
0, sizeof(int)*(lengtha
&#43; lengthb));
i&#43;&#43;)
j&#43;&#43;)
//其中字符1-->9减去‘0’得到的恰巧是整型&#20540;
&#43; j] &#43;= (dataa[i]
- '0')*(datab[j]
lengtha &#43;
lengthb - 1;
if (pres[i]
>= 10)//进位
- 1] &#43;= pres[i]
/ 10;//进位
%= 10;//取出个位数
while (pres[i]
i&#43;&#43;;//恰好不为0的位置
char *lastres
= (char*)malloc(sizeof(char)*(lengtha
&#43; lengthb));
lengtha &#43;
j&#43;&#43;,
i&#43;&#43;)
lastres[j]
&#43; '0';
lastres[j]
myclass :public
bigdatacom
class1.init("12345",
<< class1.getbigdata()
class1.coutstr();
system("pause");
bigdatacom
big1;//C&#43;&#43;结构体可要可不要struct
big1.init("123123",
"456456");
<< big1.getbigdata()
system("pause");
7.inline只是对于编译器的建议
一般情况下,我们队内联函数做如下的限制
A:不能有递归
B:不能包含静态数据
C:不能包含循环
D:不能包含switch和goto语句
E:不能包含数组
若一个内联函数定义不满足以上限制,则编译系统把它当做普通函数对待。
案例说明:
//1&#43;2*1&#43;2*1&#43;2
//inline只是对于编译器的建议
////一般情况下,我们对内联函数做如下的限制:
//(1)不能有递归
//(2)不能包含静态数据
//(3)不能包含循环
//(4)不能包含switch和goto语句
//(5)不能包含数组
//若一个内联函数定义不满足以上限制,则编译系统把它当作普通函数对待。
x);//内联函数,内部展开
x)//类型安全
x)//C&#43;&#43;类型不匹配出错,不是单纯的替换
<< GETX3(1 &#43; 2) <<
<< GETX3((1 &#43; 2)) <<
<< GETX3((2.0 &#43; 2)) <<
system("pause");
运行结果:
8.函数模板和可变参数
_CRT_SECURE_NO_WARNINGS
//函数模板,可变参数
//参数至少要有一个模板类型
data1 ...)
//参数列表的指针
va_start(arg_ptr,
count);//限定从count开始,限定多少个参数
sumres(0);
i&#43;&#43;)
sumres &#43;=
va_arg(arg_ptr,
va_end(arg_ptr);
//T通用数据类型
maxdata(p[0]);
n;i&#43;&#43;)
if (maxdata
getmax(int
//假设第一个数位最大
i < 10;i&#43;&#43;)
//确保max>= p[i]
getmax(double
p[0];//假定第一个数位最大
i&#43;&#43;)
<< sum(5, 1, 2, 3, 4, 5) <<
<< sum(6, 1, 2, 3, 4, 5, 6) <<
<< sum(7, 1, 2, 3, 4, 5, 6, 7) <<
<< sum(7, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1) <<
<< sum(6, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1) <<
<< "-----------------" <<
a[10] = { 2, 3, 4, 98, 77, 999.1, 87, 123, 0, 12 };
b[10] = { 1, 2, 3, 4,15, 6, 7, 8, 9, 10 };
10) << std::
10) << std::
system("pause");
9.auto与函数模板
A:函数参数不允许使用自动变量
B:auto结合模板函数的案例如下:
//自动数据类型,根据实际推导出类型
//根据类型获取类型
bigdata)->decltype(data
<< typeid(get(12.0,
'A')).name()
<< get(12.0,
<< typeid(get(12,
'A')).name()
<< get(12,
system("pause");
运行结果如下:
setlocale(LC_ALL,
"chs");//设置本地化
wchar_t *p1
= L"qweqeqe";
std::wcout
wchar_t *p2
= L"北京123456";
std::wcout
system("pause");
相关搜索:
相关阅读:
相关频道:
&&&&&&&&&&&&&&&&
C++教程最近更新&*&Definition&for&singly-linked&list.
&*&struct&ListNode&{
&*&&&&&int&
&*&&&&&ListNode&*
&*&&&&&ListNode(int&x)&:&val(x),&next(NULL)&{}
class&Solution&{
&&&&ListNode&*mergeTwoLists(ListNode&*l1,&ListNode&*l2)&{
&&&&&&&&if&(l1&==&nullptr)&return&l2;
&&&&&&&&if&(l2&==&nullptr)&return&l1;
&&&&&&&&ListNode*&cur&=&new&ListNode(0);&//为什么必须是ListNode(0),ListNode()就不行,这块和java有些混了
&&&&&&&&ListNode*&newhead&=&
&&&&&&&&while&(l1&!=&nullptr&&&&l2&!=&nullptr)&{
&&&&&&&&&&&&if&(l1-&val&&=&l2-&val)&{
&&&&&&&&&&&&&&&&cur-&next&=&l1;
&&&&&&&&&&&&&&&&cur&=&cur-&
&&&&&&&&&&&&&&&&l1&=&l1-&
&&&&&&&&&&&&}&else&{
&&&&&&&&&&&&&&&&cur-&next&=&l2;
&&&&&&&&&&&&&&&&cur&=&cur-&
&&&&&&&&&&&&&&&&l2&=&l2-&
&&&&&&&&&&&&}
&&&&&&&&if&(l1&!=&nullptr)&cur-&next&=&l1;
&&&&&&&&if&(l2&!=&nullptr)&cur-&next&=&l2;
&&&&&&&&return&newhead-&
Merge&two&sorted&linked&lists&and&return&it&as&a&new&list.&The&new&list&should&be&made&by&splicing&together&the&nodes&of&the&first&two&lists.
这个题目其他地方都明白,只有注释那块和java有些混了,谢谢
回复讨论(解决方案)
唯一的构造函数&ListNode(int&x)&需要单参数才能够调用。
只有带参的构造函数可用。
ListNode的类声明中查看,如果你给了ListNode(int&n)的声明,那么默认构造函数ListNode(void)就不会自动合成。如果你仍想使用ListNode(),那么在类声明中加一句:
ListNode()=&&&//告诉编译器要合成默认构造函数
你的结构体的构造函数没有不带参数的版本。。所以你要给参数。
ListNode的类声明中查看,如果你给了ListNode(int&n)的声明,那么默认构造函数ListNode(void)就不会自动合成。如果你仍想使用ListNode(),那么在类声明中加一句:
ListNode()=&&&//告诉编译器要合成默认构造函数
ListNode*&cur&=&new&ListNode(0);&//指的是为&val=0的节点开辟内存的意思吧?,但是这个题并不知道节点的数值(val=0),也就是说val随便给个数值就可以对么?
你的结构体的构造函数没有不带参数的版本。。所以你要给参数。
ListNode*&cur&=&new&ListNode(0);&//指的是为&val=0的节点开辟内存的意思吧?,但是这个题并不知道节点的数值(val=0),也就是说val随便给个数值就可以对么?
唯一的构造函数&ListNode(int&x)&需要单参数才能够调用。
ListNode*&cur&=&new&ListNode(0);&//指的是为&val=0的节点开辟内存的意思吧?,但是这个题并不知道节点的数值(val=0),也就是说val随便给个数值就可以对么?
唯一的构造函数&ListNode(int&x)&需要单参数才能够调用。
ListNode*&cur&=&new&ListNode(0);&//指的是为&val=0的节点开辟内存的意思吧?,但是这个题并不知道节点的数值(val=0),也就是说val随便给个数值就可以对么?
是的,5也行,-100也行,因为该节点的值后面根本就没有用到。
主楼的实现存在内存泄漏,实际上&new&ListNode(0)&本身都是不必要的。
唯一的构造函数&ListNode(int&x)&需要单参数才能够调用。
ListNode*&cur&=&new&ListNode(0);&//指的是为&val=0的节点开辟内存的意思吧?,但是这个题并不知道节点的数值(val=0),也就是说val随便给个数值就可以对么?
是的,5也行,-100也行,因为该节点的值后面根本就没有用到。
主楼的实现存在内存泄漏,实际上&new&ListNode(0)&本身都是不必要的。
你的结构体的构造函数没有不带参数的版本。。所以你要给参数。
ListNode*&cur&=&new&ListNode(0);&//指的是为&val=0的节点开辟内存的意思吧?,但是这个题并不知道节点的数值(val=0),也就是说val随便给个数值就可以对么?
这是通过new来动态分配内存,然后依据调用的构造函数,来将成员初始化为某值,你写0就初始化为0,写别的也可以
ListNode的类声明中查看,如果你给了ListNode(int&n)的声明,那么默认构造函数ListNode(void)就不会自动合成。如果你仍想使用ListNode(),那么在类声明中加一句:
ListNode()=&&&//告诉编译器要合成默认构造函数
ListNode*&cur&=&new&ListNode(0);&//指的是为&val=0的节点开辟内存的意思吧?,但是这个题并不知道节点的数值(val=0),也就是说val随便给个数值就可以对么?
唯一的构造函数&ListNode(int&x)&需要单参数才能够调用。
ListNode*&cur&=&new&ListNode(0);&//指的是为&val=0的节点开辟内存的意思吧?,但是这个题并不知道节点的数值(val=0),也就是说val随便给个数值就可以对么?
是的,5也行,-100也行,因为该节点的值后面根本就没有用到。
主楼的实现存在内存泄漏,实际上&new&ListNode(0)&本身都是不必要的。
明白了&谢谢C++ 定位new 的问题_百度知道
C++ 定位new 的问题
C++ primer plus 里面提到了定位new运算符 具体的语法和使用方式讲了 但原理没讲我有以下几个问题 属于理论层次的 希望能得到解答1?或者还安全么.;语句2? new和new[] 需要使用delete和delete[]释放 定位new需要么:定位new运算符是否存在释放一说。 语句2中的指针b 依然指着这段内存 还能使用么:如果不需要 那是否意味着 定位new所定位的那段内存 实际上就是由程序员自主管理 不使用了就放在那就可以了:语句1:char * a = char[512]:如果是自主管理 就产生了一个新的问题 假设有以下语句;
说明: a的地址有512字节的内存空间 是常规new分配的 至少执行语句3之前这512字节是不会被其他程序或变量占用的在语句3执行之前 可以使用 指针b对这个定位的内存区域进行赋值 或任何调整但假设语句3被执行了..?3..语句3:delete [] a:int * b = new(a) char[512]?2.? 因为这个内存已经不由程序管理了 如果指针b还使用的话当建立其他变量时 该段内存是否会被占用
提问者采纳
不过需要手动调用对象的析构函数确实是程序员自主管理、make_shared函数在动态内存上构造对象(返回对应的shared_ptr),placement new实际的行为只是调用构造函数而已显然不能placement new是给有特殊要求的底层实现准备的,实际写高级应用的时候没必要用到显式的new和delete。标准库有shared_ptr类可以自动管理动态内存placement new不需要调用delete
提问者评价
其他类似问题
为您推荐:
其他1条回答
根本上; 放置,放置式只能是这类,operator new显示不调用构建子int* pi = new(pc) int[128]:operator new(512):为使用语言内置的new:; :char* pc = ,如果只用C++,使用类定义的new(如果有)
所答非所问。
这意味着放置式也需要析构,和一般的new没有什么区别。现时发现,其实::operator new[](512)才对,不应该写在::operator new(512),因为后来的是new放置是数组
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 new ipad发热问题 的文章

 

随机推荐