请操作员 delete
为新手提供帮助
演示代码:
MyType getDataFromDB()
{
Driver *driver;
Connection *con;
Statement *stmt;
ResultSet *res;
/* Create a connection */
driver = get_driver_instance();
con = driver->connect("tcp://127.0.0.1:3306", "login", "pass");
/* Connect to the MySQL test database */
con->setSchema("schema");
stmt = con->createStatement();
MyType resultAnythngAndAnother;
// First query
res = stmt->executeQuery("SELECT anything");
while (res->next())
{
// fetch data from "SELECT anything"
}
delete res; // <----- Question #1: Should I every time call delete res before next assigning of res variable?
// Another query
res = stmt->executeQuery("SELECT another");
while (res->next())
{
// fetch data from "SELECT another"
}
delete res; // <----- Question #2: Is it enough to call delete res only once here? Since it won't be used anymore.
return resultAnythngAndAnother;
}
谢谢。
答案 0 :(得分:3)
你应该使用std::make_unique
- 完全避免使用裸指针,除非你有一个特殊情况,你不负责释放对象。
答案 1 :(得分:1)
是
对于每个新的,必须有一个删除,否则你将有内存泄漏。您只需在使用已分配的内容后删除一次。
另一个好的编程习惯是
res = nullptr;
所以你不会有任何悬空指针。但是在这段特定的代码中不需要这样做
你还应该阅读有关智能指针的内容,根据bjarne stroustrup,不应该在现代c ++中使用new和delete。
答案 2 :(得分:1)
除非您使用new
或您正在呼叫的功能的文档分配说客户端必须使用delete
释放内存,否则您应不盲目致电该指针上有delete
。
你不知道指针的来源。它可能是用new
创建的,它可能是用malloc
创建的,它可能是一个更大的内存池中的指针,你不知道。
通常的情况是文档会声明调用其他函数来释放内存或句柄。
答案 3 :(得分:1)
第一个
res = stmt->executeQuery("SELECT anything");
while (res->next())
{
// fetch data from "SELECT anything"
}
delete res; // <----- Question #1: Should I every time call delete res before next assigning of res variable?
答案取决于文档中有关影响res
的功能的内容。在这种情况下,答案归结为stmt->executeQuery()
和res->next()
的行为。虽然我预计res->next()
的调用不会影响您是否需要发布res
,但阅读文档是唯一可以确定的方法。
如果文档明确说明完成后您需要delete res
,那么您应该这样做。
如果它说完成后你需要调用其他一些功能(比如Release(res)
),你应该这样做。
如果文档中没有说明任何内容,那么最好不要做任何事情。如果你不知道,delete res
当res
不是一个应该是delete
的指针时,d更有可能产生不必要的影响,而不是什么都不做。
对于第二个,如果(并且仅当)您需要delete res
,则只需执行一次。删除指针两次会产生未定义的行为。
简而言之:只有delete res
如果你知道它是必需的,并且不会delete res
不止一次。