社区
C++ 语言
帖子详情
烦闷啊,编译器不能这样搞啊!
cs60089
2009-03-14 01:13:34
我想问一下,进入一个函数后,是把函数中所定义的所有的类型都入栈呢?还是程序走到类型定义的句子(如int a=fun();)才入栈?
不同编译器会不会不同?
...全文
146
18
打赏
收藏
烦闷啊,编译器不能这样搞啊!
我想问一下,进入一个函数后,是把函数中所定义的所有的类型都入栈呢?还是程序走到类型定义的句子(如int a=fun();)才入栈? 不同编译器会不会不同?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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;语句要放在哪里合适??
STM32F4(LED)
STM32F4(LED) GitHub仓库:https://github.com/XinLiGitHub/STM32F4xx_LED_Example PS:博文不再更新,后续更新会在GitHub仓库进行。 在实际的项目开发过程中,常常会遇到硬件电路的修改,然后修改的部分就需要修改驱动程序。想这样需求该来该去是程序员们最
烦闷
的事情(重复劳动痛不欲生啊~)。为了避免或减少重
STM32F4(KEY)
STM32F4(KEY) GitHub仓库:https://github.com/XinLiGitHub/STM32F4xx_KEY_Example PS:博文不再更新,后续更新会在GitHub仓库进行。 在实际的项目开发过程中,常常会遇到硬件电路的修改,然后修改的部分就需要修改驱动程序。想这样需求该来该去是程序员们最
烦闷
的事情(重复劳动痛不欲生啊~)。为了避免或减
STM32F4(BUZZ)
STM32F4(BUZZ) GitHub仓库:https://github.com/XinLiGitHub/STM32F4xx_BUZZ_Example PS:博文不再更新,后续更新会在GitHub仓库进行。 在实际的项目开发过程中,常常会遇到硬件电路的修改,然后修改的部分就需要修改驱动程序。想这样需求该来该去是程序员们最
烦闷
的事情(重复劳动痛不欲生啊~)。为了避免
嵌入式笔记(入门系列2)
首先,在
编译器
尚不完备的过去,
编译器
需要听从程序员的指令对函数进行可能的内联操作,伴随着
编译器
的进步,越来越多的
编译器
在一定的现代C/C++语境下,开始使用自己的估算程序估算内联是否可以带来内联操作。就这样放着,然后使用
编译器
只做预处理,你就会高兴的发现自己的代码多出了一大堆,仔细一瞧就是文件咔的一下贴在了文件的第一行——哈哈,这下也成写几千行代码的人了,可惜是CV出来的。如果嵌套了结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
计算机培训费用濮阳,濮阳云计算培训,濮阳计算机培训费用,濮阳计算机培训完工作好不好找 - IT教育频道...
濮阳云计算培训首页>云计算> 濮阳云计算培训作者:镀金池发布时间:2017-10-20总之,曾经有计算机科学家证实了,C语言实际上是可以议决下面说的 CVM 的方式完成完全的
编译器
的,那末现实上是怎样做到简化的呢。苹果的图形界面在 80 年月就像一个天外来物,将
烦闷
的计算机抽象击碎,并带来了宗教般的亢奋。濮阳云计算培训她在客岁秋季阅读TechCrunch时,适值读到一篇闭于付出雄...
C++ 语言
65,211
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章