拿出50分,讨论一个基本的问题:new之后一定要判断得到的指针是否为NULL呢?

admireO 2001-06-13 11:40:00
如果用动态申请内存的话,能不能保证每次申请都成功呢?也就是失败的概率到底有多大?要不要每次申请完之后都判断是否为NULL呢?
...全文
317 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
Suprman 2001-06-16
  • 打赏
  • 举报
回复
++






























































































__
taosi 2001-06-15
  • 打赏
  • 举报
回复
资源严重不足!(严重到什么程度,我也不清楚! ^&^)

可以来个循环吗?在一定的限制次数之内,直到NEW返回为真的时候。

我是编程爱好者!
Babyfacer 2001-06-15
  • 打赏
  • 举报
回复
上面说了这么多了,把我想说的和还没有想到的都说了,我在这里祝你考试成功!

好好研究源代码!

娃娃脸敬上
Suprman 2001-06-14
  • 打赏
  • 举报
回复
同意phy(beatrice)的意见!
很明显程序中的任何一相情愿,都将成为以后的祸根!
这决不是危言耸听!
如果你知道利用“缓冲区溢出的”的攻击手段,更能体会到这一点。
在一般情况下即使你不锁家门,也不会丢东西,但是。。。

karma 2001-06-14
  • 打赏
  • 举报
回复
简单的答案:不需要
复杂的答案:去读Scott Meyers在<<Effective C++>>(2nd ed)里的解释
brallow 2001-06-14
  • 打赏
  • 举报
回复
如果你是一个编程爱好者,你可以不这样做,但是如果你是一个程序员或者你想要做一个程序员的
话我想你还是加是去吧。在大多数的情况下这就是业余与专业的区别!
SuperProgMan 2001-06-14
  • 打赏
  • 举报
回复
To long_9(): 
__try、__finally、__except是Windows的结构化异常处理SEH.
try、catch是c++的异常处理。
TRY、CATCH是MFC的异常处理。
long_9 2001-06-14
  • 打赏
  • 举报
回复
我想问一下:
new的代码是写在__try里还是try外?

CMyCls *mcTest = new CMyCls
__try
....
__finally
delete mcTest;

还是:

__try
CMyCls *mcTest = new CMyCls

....
__finally
delete mcTest;
smq 2001-06-14
  • 打赏
  • 举报
回复
在Release版本中需要, 在Debug版本中不需要,总起来说需要

内存漏洞的检查
也许你已经知道,在C++和C语言中指针问题也就是内存申请与释放是一个令人头疼的事情,假如你申请了内存,但没有释放,并且你的程序需要长时间地运行,那么,系统的资源将逐渐减少,当系统的资源全部被用完时,系统将会崩溃。所以在开发程序的过程中一定要保证资源的完全释放。下面我们来介绍内存漏洞的检查。
也许你会问,系统是怎样支持内存漏洞的检查的?其实在你的Debug版本中所有的有关内存分配的函数都是被重载过的,具体过程是这样的,当你的程序申请内存时,它首先调用一般的内存分配函数分配一块稍大的内存块。在这一内存块中分为四个小块:Heap Information, buffer , User memory block, buffer。第一块为有关堆的信息,比如,申请该内存的地点(文件名,行号),此内存块的类型(如整型,浮点,或某一类的对象)等等。第二块是一个缓冲区,用于截获用户对其申请内存使用越界的情况。第三块是真正给用户的内存,返回的指针也是指向这儿。第四块也是一个缓冲区,作用同第二块。
当你申请的内存均被记录在案后,要检查内存漏洞就比较容易了,粗略地说,假如你要检查某一程序段是否有内存漏洞,你只需在这一程序 段的开始要求系统为你做一个内存使用情况的映象,记录下程序开始时的内存使用情况,然后在程序段的末尾再使系统为你做一次内存映象,比较两次映象,以检查是否有没释放的内存,假如有未释放的内存,根据这一块中有关分配情况的信息来告诉用户在那儿申请的内存没释放。
具体地讲检查内存漏洞需要以下几个步骤:
 在你所检测的程序段的开始处建立一个CmemoryState对象,调用其成员函数Checkpoint,以取得当前内存使用情况的快照;
 在你所检测的程序段的末尾处再建立一个CmemoryState 对象,调用其成员函数Checkpoint ,以取得当前内存使用情况的快照;
 再建立第三个CmemoryState 对象,调用其成员函数Difference,把第一个CmemoryState对象和第二个CmemeoryState对象作为其参数.,如果两次内存快照不相同,则该函数返回非零,说明此程序 段中有内存漏洞。下面我们来看一个典型的例子:

// Declare the variables needed
#ifdef _DEBUG
CMemoryState oldMemState, newMemState, diffMemState;
OldMemState.Checkpoint();
#endif
// do your memory allocations and deallocations...
CString s = "This is a frame variable";
// the next object is a heap object
CPerson* p = new CPerson( "Smith", "Alan", "581_0215" );
#ifdef _DEBUG
newMemState.Checkpoint();
if( diffMemState.Difference( oldMemState, newMemState ) )
{
TRACE( "Memory leaked!\n" );
}
#endif
smq 2001-06-14
  • 打赏
  • 举报
回复
在Release版本中需要, 在Debug版本中不需要,总起来说需要
taosi 2001-06-14
  • 打赏
  • 举报
回复
判断吧!
admireO 2001-06-14
  • 打赏
  • 举报
回复
可恶的期末考试让我去复习了,没想到晚上来的时候看到这么多人讨论.只有50分,给谁好呢?每个人都分点吧;)明天结账,大家还有没有意见.我以前喜欢用new,delete.但从来都不判断的,看来还只能算个编程爱好者了.请问如果出现new操作失败,是不是就要结束当前应用程序呢.不知道有谁能讲一下这种失败的可能性到底大不大呢?
seedundersnow 2001-06-14
  • 打赏
  • 举报
回复

尽管大多数时候不出问题,但这100%是个bug,特定条件满足,程序会出问题

leky2000 2001-06-14
  • 打赏
  • 举报
回复
还是判断好
oldnew 2001-06-14
  • 打赏
  • 举报
回复
new 的操作是:用malloc()分配一块内存,如果分配成功,则继续调用类的构造函数,否则就不会调用构造函数,而直接返回NULL
还是要判断一下
long_9 2001-06-14
  • 打赏
  • 举报
回复
我想问一下:
new的代码是写在__try里还是try外?

CMyCls *mcTest = new CMyCls
__try
....
__finally
delete mcTest;

还是:

__try
CMyCls *mcTest = new CMyCls

....
__finally
delete mcTest;

SuperProgMan 2001-06-14
  • 打赏
  • 举报
回复
稳妥起见要判断一下,
因为如果你要申请的内存大小比CRT堆增长的极限要大,或者碎片较多,则可能失败,返回NULL.

内存分配失败,一般要抛出异常。你可以通过异常处理而获知,就不用判NULL了。

给分吧!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ahphone 2001-06-14
  • 打赏
  • 举报
回复
new之后一般会有一个delete,如果new 不成,确实应该有个保证措施,但没必要每次都判断。
cbc 2001-06-14
  • 打赏
  • 举报
回复
同楼上的,
象印度人的代码,防御性的代码很多
seesi 2001-06-14
  • 打赏
  • 举报
回复
完满的答案!
加载更多回复(3)

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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