**********new 和析构的疑惑
mysqlpp::Connection *m_pConn = NULL;
try
{
m_pConn = new mysqlpp::Connection(use_exceptions);//标准例子中是直接定义对象
m_pConn-> connect( "test ", "test ", "root ", "root ", 3306, 0, 60, NULL);
Query qQuery = m_pConn-> query();
delete m_pConn;
}
catch (exception& ex)
{
delete m_pConn;//是否需要这个?
cout < < "some errer " < < endl;
}
在catch中是否需要delete m_pConn,感觉捕获异常后是否会自动析构
[解决办法]
在堆中定义的对象,除非手动delete释放,它不会自动释放的,
一旦一个异常抛出,它一般会离开当前的作用域,所以在
catch 语句中为防止内存泄露,进行资源释放是必要的
[解决办法]
smart pointer
[解决办法]
需要
[解决办法]
使用智能指针是个好习惯 ~
[解决办法]
同意,使用智能指针吧。。。 auto_ptr?
[解决办法]
auto_ptr <mysqlpp::Connection *> m_pConn ;
try
{
m_pConn =auto_ptr <mysqlpp::Connection *> ( new mysqlpp::Connection(use_exceptions));//标准例子中是直接定义对象
m_pConn-> connect( "test ", "test ", "root ", "root ", 3306, 0, 60, NULL);
Query qQuery = m_pConn-> query();
}
catch (exception& ex)
{
cout < < "some errer " < < endl;
}
这样就不用管m_pConn的动态释放
[解决办法]
保证在各种情况下,new和delete能够成对运行就行。
[解决办法]
是STL标准模版库里的一个东西,在linux下好像有个C++的编译器吧,好像是g++吧,
好久不用了。
[解决办法]
想问一下全局的new的声明是什么啊???
[解决办法]
没用过智能指针,在linux下gcc下要安装什么么?是否要包含什么头文件么?
它是标准内容之一,
不需要再安装什么了 ~~
Using auto_ptr Effectively:
http://www.gotw.ca/publications/using_auto_ptr_effectively.htm
[解决办法]
没用过智能指针,在linux下gcc下要安装什么么?是否要包含什么头文件么?
///////////////
智能指针是标准C++的东西,不需要安装任何的其它库,要包含的头文件是#include <memory>
[解决办法]
看看more effective c++ 条款10,对于你这种情况有专门讲解。
总之new一个对象分两步,
第一步是new操作符为你分配内存,如果这一步出现了异常,c++标准规定
系统会自动为你释放这块内存。
第二步是调用构造函数,如果你的mysqlpp::Connection对象的构造函数
产生了异常,则要根据条款10分情况处理。
但有一点是确定的,就是以上两步任何一步产生异常,m_pConn都是不会被赋值的,
因此即使你在这里用了智能指针,我觉得也是没有用处的。
[解决办法]
忘了说我的结论了,就是在catch中不能delete,因为这时候为时已晚,具体操作的方法
还是看书吧。
[解决办法]
想起来了,我说的还是不够确切,第一步new操作符分配内存,如果出现异常,说明
内存分配失败,也就不必delete。如果第二步出现异常,则第一步new操作符分配成功的
内存会被系统自动释放。
[解决办法]
这个主要看是哪一步抛出的异常.
m_pConn = new mysqlpp::Connection(use_exceptions);//标准例子中是直接定义对象
这里面抛出异常,对你而言,什么都做不了.虽然meyer给了具体过程的剖析和解释,但最后你还是什么都做不了.
m_pConn-> connect( "test ", "test ", "root ", "root ", 3306, 0, 60, NULL);
Query qQuery = m_pConn-> query();
这2句抛出异常,需要delete;
delete m_pConn;
这句不会抛出异常
[解决办法]
恩,使用smart pointer是个不错的选择。