1

看一下这个示例函数:

RuntimeConfiguration* conf_rt_conf() {

    RuntimeConfiguration *conf;
    conf = new RuntimeConfiguration();
    conf->arch_path="./archive";
    conf->err_log="./err_log";
    conf->fail_log="./fail_log";
    conf->msg_log="./msg_log";
    conf->save="html, htm, php";
    conf->ignore="jpg, gif";
    conf->cookies="";

    return conf;
}

这里的一切都很好,但是当我运行这样的东西时:

DatabaseInput** conf_db_input() {

    DatabaseInput **db_input;
    db_input=(DatabaseInput **)malloc(NUMB_SITES*sizeof(DatabaseInput *));
    for (int i=0;i<NUMB_SITES;i++) db_input[0]= new DatabaseInput();

    db_input[0]->full_name="ABCNews";
    db_input[0]->alias="abcn";
    db_input[0]->prefix="/eng";

    db_input[1]->full_name="Rzeczpospolita";
    db_input[1]->alias="rp";
    db_input[1]->prefix="/pol";

    return db_input;
}

我在第一次分配时遇到分段错误。它可能与为此结构分配的固定内存块有关。如何让它正常工作?

4

9 回答 9

6

我会改变

for (int i=0;i<NUMB_SITES;i++) db_input[0]= new DatabaseInput();

首先:

for (int i=0;i<NUMB_SITES;i++) db_input[i]= new DatabaseInput();
于 2009-04-28T13:48:32.300 回答
3

您的代码提示了几个问题:

  • RuntimeConfiguration 的声明是什么?
  • 你为什么混合使用malloc和new?
  • 你不使用像 std::vector 这样的 C++ 容器吗?
于 2009-04-28T13:48:51.940 回答
2

首先...您从未听说过(默认)构造函数吗?这读起来就像使用“new”的 C 代码,总是有点吓人。

其次,您所有新分配的结构都存储在db_input[0],这似乎是错误的。

于 2009-04-28T13:47:52.020 回答
2

乍一看

db_input[0]=新数据库输入();

我认为应该是

db_input[i]= new DatabaseInput();

也建议检查一下malloc操作的结果

于 2009-04-28T13:49:09.817 回答
1

你的'for'循环不需要引用db_input[i]吗?

于 2009-04-28T13:47:52.020 回答
1

也许是这样:

DatabaseInput *db_input[];
db_input = new DatabaseInput*[NUMB_SITES]; // Creates an array of pointers
for (int i=0; i<NUMB_SITES; i++) db_input[i]= new DatabaseInput();

可以工作吗?(我没有测试过)

请注意,要释放使用的内存,您应该执行以下操作:

for (int i=0; i<NUMB_SITES; i++) delete db_input[i];
delete[] db_input;
于 2009-04-28T13:58:14.647 回答
0

也许,你应该使用 db_input[i]

于 2009-04-28T13:47:21.553 回答
0

如果没有更多详细信息,我们无法确定错误。但有几点说明:

  • 把new和malloc混在一起,特别是在同一个函数里,真是自找麻烦。除非您有充分的理由这样做,否则不要这样做,因为您很可能在新分配的缓冲区或 delete 和 malloc 分配的缓冲区上使用 free。
  • 当您分配单个 DatabaseInput 时,您很可能会遇到错误,因为索引永远不会改变
于 2009-04-28T13:51:45.270 回答
0
db_input[0]= new DatabaseInput();

它实际上有 i 而不是 0,我只是尝试了几件事,在复制源代码时错过了那个零,所以这不是答案。

===编辑===

db_input = new DatabaseInput*[NUMB_SITES];

那行得通,谢谢加斯顿:)

于 2009-04-28T15:09:47.847 回答