这是我的情况:
void Database::execute(string query, Table *outTable) {
//some code
if (isSelect) {
outTable = new Table(rowCount, columnCount);
}
// some code
}
我的想法是函数execute对db执行查询。如果查询产生表(例如选择),我分配outTable。 无论如何,在执行这个函数之后,当我尝试在调用函数中对outTable做一些事情时,我得到一个段错误。我已经检查过该函数是否使用命令new执行该行。 这有什么不对?
以下是我在调用函数时所做的事情:
Database d = new Database("mydb");
Table *t;
d.execute("SELECT * FROM TABLE1", t);
int n = t->rowCount(); //here I get the segfault
答案 0 :(得分:1)
参数是函数的局部变量。因此,在您的情况下,不会更改表的原始指针。仅更改函数的局部变量。通过引用传递此参数或使用指针再应用一个间接。例如
void Database::execute(string query, Table * &outTable);
d.execute("SELECT * FROM TABLE1", t);
或
void Database::execute(string query, Table * *outTable);
d.execute("SELECT * FROM TABLE1", &t);
答案 1 :(得分:1)
Table *outTable
是execute函数的本地,它是传入的变量的副本,因此调用函数中的Table指针不会在execute中分配任何内容。
如果您只是在调用函数中打印表指针的地址,然后在执行本身内打印outTable的地址(通过不取消引用指针),则可以验证这一点。
答案 2 :(得分:1)
问题是你正在传入一个指针 - 输入变量是函数的本地变量。所以你需要获取meta并传递你想要存储输出值的指针的地址,或者使用引用(有点实现为带有契约的指针,语言将尝试确保传递具体值)
最后值得注意的是:
bool Database::execute(const std::string& query, Table& into)
这样可以避免将查询复制到本地执行的临时字符串中,并允许调用者为您提供一个由您的函数填充的表。
编写了其中一些,您可能需要考虑使用bool来表明查询是否成功:)
Table myTable;
bool success = d.execute("SELECT 'fail' FROM DUEL", myTable);
if (!success)
herp();
有关指针的更多信息,请参阅我之前对非常相似问题的回答:Pointer errors in the method of transmission(c++)