开发者

C++ Class Pointer Deletion (Segmentation Fault Issue)

SOLVED

Well, it seems that I'm receiving a segmentation fault when I try deleting my class pointer. I've tried many things, but yet haven't got it to work. Anyways, here is my main.cpp: (this segmentation fault is occurring when I delete 'm')

    /*
 * Copyright(c)Fellixombc 2010
 *
 * TextToSqlRs is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * TextToSqlRs is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with TextToSqlRs.  If not, see <http://www.gnu.org/licenses/>.
 */

#include <ctime>
#include <iostream>
#include <unistd.h>
#include <string>
#include "eMysql.h"
#include "manage.h"

using namespace std;

int main() {
    time_t start, stop;
    double TIME;
    string host, user, password, database;
    string path;
    bool run = true;
    int runtime;
    int MAX;
    int max;


    cout << "Please enter the required information." << endl << "Absolute path to character folder: ";
    cin >> path;
    cout << "MySql Database Host: ";
    cin >> host;
    cout << "MySql Username: ";
    cin >> user;
    cout << "MySql Password: ";
    cin >> password;
    cout << "Database name: ";
    cin >> database;

    start = clock();
    eMysql* m = new eMysql;
    Manage* manage = new Manage;
    m->connect(host.c_str(), user.c_str(), password.c_str(), database.c_str());
    manage->ReadD开发者_如何学Cir(path);
    manage->TextToSql(m);

    delete manage;
    delete m;

    stop = clock();

    TIME = ((double)stop - (double)start)/CLOCKS_PER_SEC;
    cout << "Finished in " << TIME << " seconds" << endl; }

eMysql deconstructor:

eMysql::~eMysql() {
mysql_free_result(result);
mysql_close(&mysql);

if(lengths) delete lengths;
if(result) delete result; }

mysql/result header:

#ifndef _MYSQL_H
#define _MYSQL_H

#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <fstream>
#include <mysql/mysql.h>
#include <string>

using namespace std;

class eMysql {
public:
    eMysql();
    int connect(const string, const string, const string, const string);
    int query(string query);
    int strip(string&);
    int rows();
    virtual ~eMysql();
private:
    MYSQL mysql;
    MYSQL_RES *result;
    MYSQL_ROW row;
    unsigned int i;
};

#endif  /* _MYSQL_H */

mysql initializer

eMysql::eMysql() {
    mysql_init(&mysql);
}

result initializer

int eMysql::query(string query) {
    if(mysql_query(&mysql, query.c_str())) {
        cout << "Failed to run query: " << mysql_error(&mysql) << endl;
        exit(1);
    }
    result = mysql_store_result(&mysql);
    query.erase();
    return 1;
} 


I don't see any code that initializes lengths or result, so you might be deleting wild pointers.


Since you never call query, you're operating on an invalid result pointer. In the eMysql constructor, initialize result to NULL:

eMysql::eMysql() : result(NULL) {
  // ...
}

Then, in the destructor:

eMysql::~eMysql() {
  if (result) mysql_free_result(result);
  mysql_close(&mysql);
}

One thing looks wrong in the destructor:

eMysql::~eMysql() {
  // You use "result" here, but later check if it's not NULL.
  // You should only free if it's not null.
  mysql_free_result(result);
  mysql_close(&mysql);

  if(lengths) delete lengths;
  // Are you sure you need to delete this?  Isn't that what the
  // mysql_free_result is for?  This will still be a non-NULL ptr
  // that has already been free'd.  This might be a double-delete
  // which would likely manifest as a segmentation fault.
  if(result) delete result;
}

But there could be other problems.

  • Does TextToSQL take ownership of m?
  • Are result and mysql valid in the ~eMysql?
  • Is lengths allocated as an array? Delete with delete [] lengths;
  • I assume these are class members, are they initialized at all?

Here are a couple methods for debugging these types of problems (on Linux):

  • Run valgrind to check for invalid memory references.
  • Run gdb, type bt when it crashes.
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜