C ++删除运算符。怎么用得好?

时间:2016-01-11 23:41:03

标签: c++

请操作员 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;
}
  • 问题#1:我是否应该在下次分配res变量之前每次调用delete res?
  • 问题2:只拨打一次删除资源是否足够?因为它不会再使用了。

谢谢。

4 个答案:

答案 0 :(得分:3)

你应该使用std::make_unique - 完全避免使用裸指针,除非你有一个特殊情况,你不负责释放对象。

答案 1 :(得分:1)

  1. 对于每个新的,必须有一个删除,否则你将有内存泄漏。您只需在使用已分配的内容后删除一次。

  2. 另一个好的编程习惯是

    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 resres不是一个应该是delete的指针时,d更有可能产生不必要的影响,而不是什么都不做。

对于第二个,如果(并且仅当)您需要delete res,则只需执行一次。删除指针两次会产生未定义的行为。

简而言之:只有delete res如果你知道它是必需的,并且不会delete res不止一次。