烦闷啊,编译器不能这样搞啊!

cs60089 2009-03-14 01:13:34
我想问一下,进入一个函数后,是把函数中所定义的所有的类型都入栈呢?还是程序走到类型定义的句子(如int a=fun();)才入栈?
不同编译器会不会不同?
...全文
146 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
chin_chen 2009-03-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 coding_hello 的回复:]
引用 2 楼 cs60089 的回复:
我也觉得是这样,但是必须要搞清楚啊,否则就可能会有内存泄漏,另外, 入栈初不初始化也是个问题
例如
fun(){
int temp;
throw temp;
}

void fun1(){
try{
int a;
fun();
int* p=null;
p=new int[40]

}
catch(int temp){
delete[] p;

}
}

p入栈的时机就很关键了


关键个狗P.

p的作用域在try{}之内,catch里面根本看不到这个p.
你这代码能编译过去就牛了。

[/Quote]
哇,不能这样说人家啊。楼主把那个p放在大括号外面去吧。
野男孩 2009-03-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cs60089 的回复:]
我也觉得是这样,但是必须要搞清楚啊,否则就可能会有内存泄漏,另外, 入栈初不初始化也是个问题
例如
fun(){
int temp;
throw temp;
}

void fun1(){
try{
int a;
fun();
int* p=null;
p=new int[40]

}
catch(int temp){
delete[] p;

}
}

p入栈的时机就很关键了
[/Quote]

关键个狗P.

p的作用域在try{}之内,catch里面根本看不到这个p.
你这代码能编译过去就牛了。
cutepig123 2009-03-14
  • 打赏
  • 举报
回复
函数调用有
fastcall的话似乎是把参数放在寄存器里了,所以不是参数都要入栈
stdcall,cscall具体看网上有很多文章的
baihacker 2009-03-14
  • 打赏
  • 举报
回复
只是函数需要的参数要入栈...而且顺序未定.
这里和p有关?
只是注意分配的内存如何释放罢了.
cs60089 2009-03-14
  • 打赏
  • 举报
回复
我不那么认为
p还没有被初始化呢
我想到了解决方法了,明天再说
pengzhixi 2009-03-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cs60089 的回复:]
我也觉得是这样,但是必须要搞清楚啊,否则就可能会有内存泄漏,另外, 入栈初不初始化也是个问题
例如
fun(){
int temp;
throw temp;
}

void fun1(){
try{
int a;
fun();
int* p=null;
p=new int[40]

}
catch(int temp){
delete[] p;

}
}

p入栈的时机就很关键了
[/Quote]

你这样就可以了 啊 。能保证内存不会泄漏
cs60089 2009-03-14
  • 打赏
  • 举报
回复
好吧,我估记是先全部入栈
可问题是,那个delete[]p该怎么写好呢
如果p开始入栈,他的值并非null,而程序到了fun()就停止了
cs60089 2009-03-14
  • 打赏
  • 举报
回复
我也觉得是这样,但是必须要搞清楚啊,否则就可能会有内存泄漏,另外, 入栈初不初始化也是个问题
例如
fun(){
int temp;
throw temp;
}

void fun1(){
try{
int a;
fun();
int* p=null;
p=new int[40]

}
catch(int temp){
delete[] p;

}
}

p入栈的时机就很关键了
arong1234 2009-03-14
  • 打赏
  • 举报
回复
为什么p入栈时机会有影响?!无论p是否入栈,你导致内存泄漏的不是p自己,而是那个new

[Quote=引用 2 楼 cs60089 的回复:]
我也觉得是这样,但是必须要搞清楚啊,否则就可能会有内存泄漏,另外, 入栈初不初始化也是个问题
例如
fun(){
int temp;
throw temp;
}

void fun1(){
try{
int a;
fun();
int* p=null;
p=new int[40]

}
catch(int temp){
delete[] p;

}
}

p入栈的时机就很关键了
[/Quote]
amossavez 2009-03-14
  • 打赏
  • 举报
回复
这个问题不是很明白,谁能好好讲讲呀!!
pengzhixi 2009-03-14
  • 打赏
  • 举报
回复
int* p=null;
你把这个放到try块里面干啥呢
cs60089 2009-03-14
  • 打赏
  • 举报
回复
是让你吧try关键词放到p=new int[40];后面。


=================
喔,明白了!
是这样:

void fun1(){
p=new int[40];
try{
int a;
int* p=null;
fun();

fun3();
fun4();//fun3(),fun4()在发生异常时都会抛出;并且由于程序逻辑关系,fun3,fun4必须放在p=new int[40];之后

}
catch(int temp){
if(p)
delete[] p;
throw;

}

}

谢谢!
cs60089 2009-03-14
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 pengzhixi 的回复:]
是让你吧try关键词放到p=new int[40];后面。
[/Quote]

没有,delete[]p还没有执行到,就跳出去了,会造成内存泄漏
cs60089 2009-03-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 lw1a2 的回复:]
入栈的时候又不new

你只要new之后,delete之前别抛异常就行了,否则就用智能指针
[/Quote]

汗啊,什么delete之前别抛异常啊,现实不是正好在delete之前抛异常吗?你没看我的注释吧
pengzhixi 2009-03-14
  • 打赏
  • 举报
回复
我觉得调用函数就开始入栈了。
pengzhixi 2009-03-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 cs60089 的回复:]
chin_chen:

这就不对了,如果放在括号外面去的话,那么如果fun1()还要抛出怎么办,如下:
void fun1(){
try{
int a;
int* p=null;
fun();
p=new int[40];
fun3();
fun4();//fun3(),fun4()在发生异常时都会抛出;并且由于程序逻辑关系,fun3,fun4必须放在p=new int[40];之后

}
catch(int temp){
throw;

}

}

这个de…
[/Quote]
是让你吧try关键词放到p=new int[40];后面。
lw1a2 2009-03-14
  • 打赏
  • 举报
回复
入栈的时候又不new

你只要new之后,delete之前别抛异常就行了,否则就用智能指针
cs60089 2009-03-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 chin_chen 的回复:]
楼主把那个p放在大括号外面去吧。
[/Quote]

chin_chen:

这就不对了,如果放在括号外面去的话,那么如果fun1()还要抛出怎么办,如下:
void fun1(){
try{
int a;
int* p=null;
fun();
p=new int[40];
fun3();
fun4();//fun3(),fun4()在发生异常时都会抛出;并且由于程序逻辑关系,fun3,fun4必须放在p=new int[40];之后

}
catch(int temp){
throw;

}

}

这个delete[] p;语句要放在哪里合适??

65,211

社区成员

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

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