您的位置:程序门 -> vc/mfc -> 基础类



异常与内存处理


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


异常与内存处理[已结贴,结贴人:leaf__leaf]
发表于:2007-08-31 15:42:55 楼主
这么一段代码:
void   f(int   i,   char   *   str)
{
        char   *   c   =   new   char   [strlen(str)   +   1];
        if   (i <0)   throw   i;
}

void   g(void)
{
        f(-1,   "abc ");
}

void   main(void)
{
        try   {   g();   }
        catch   (int   i   &)   {   cout < < "error " < <endl;   }
}

执行之后,会发生内存泄漏。
在更多的情况下,g这个函数是没法将所有有可能抛出异常的函数全部try   catch一遍的,而f这个函数则认为,如果它抛出异常了,则要求程序中止。这种矛盾怎么解决?
发表于:2007-08-31 15:45:181楼 得分:0
弄错了!!!!!!!!!!!!!!!!!!!!!!
void   f(int   i)
{
if   (i <0)   throw   i;
}

void   g(char   *   str)
{
char   *   c   =   new   char   [strlen(str)   +   1];
f(-1,   "abc ");
}

void   main(void)
{
try   {   g();   }
catch   (int   i   &)   {   cout < < "error " < <endl;   }
}
应该是这样,g在意外的情况下,被f中抛出的异常给中断了,之前的内存来不及处理。
发表于:2007-08-31 15:53:252楼 得分:0
void   f(int   i)
{   if   (i <0)   throw   i;   }

void   g(void)
{   char   *   c   =   new   char   [10];   f(-1);   delete   []   c;   }

void   main(void)
{
try   {   g();   }
catch   (int   i   &)   {   cout < < "error " < <endl;   }
}
今天脑子有点不好使了……
意外的情况下,g被f中抛出的异常中断了,c所分配的内存来不及处理。而main又把异常处理了,继续运行,这样会出现内存泄漏。这种情况该怎么办?有什么牛人发表了理论来避免这些问题?
发表于:2007-08-31 17:13:053楼 得分:2
看糊涂了,大概是说怎么避免函数中意外退出的时候分配的内存没有释放而造成的内存泄漏。一般推荐用智能指针。
发表于:2007-08-31 23:30:254楼 得分:0
大概是说怎么避免函数中意外退出的时候分配的内存没有释放而造成的内存泄漏
对的。在g这个函数中分配的内存因为f的异常而意外退出,内存没有释放而造成了泄漏。
一般推荐用智能指针。
何为智能指针呢?我c++理论学得不多,希望多多指点,先谢过。这个问题我想了一晚了,估计想破头也不会有什么好办法。
发表于:2007-09-01 01:34:265楼 得分:3
auto_ptr <返回值类型>   变量名(   new   类型(   分配数目   )   );
如:aoto_ptr <int>   p(   new   int(10)   );
然后可以象使用普通指针一样使用该p


快速检索

最新资讯
热门点击