繁体   English   中英

C ++中字符串分配的分段错误

[英]Segmentation fault on string assignment in C++

看一下这个示例函数:

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;
}

第一次分配时出现细分错误。 它可能与为此结构分配的固定内存块有关。 我如何使其正常工作?

我会改变

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();

您的代码提示几个问题:

  • RuntimeConfiguration的声明是什么?
  • 您为什么混用malloc和new?
  • 您不使用诸如std :: vector之类的C ++容器吗?

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

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

乍看之下

db_input [0] = new DatabaseInput();

我认为应该

db_input[i]= new DatabaseInput();

还建议检查malloc操作的结果

您的“ for”循环不需要引用db_input[i]吗?

也许这样:

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;

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

没有更多细节,我们将无法确定错误。 但有几点要点:

  • 混合new和malloc,尤其是在同一函数中,确实是在找麻烦。 除非您有充分的理由这样做,否则不要这样做,因为您极有可能在新分配的缓冲区上使用free或delete和一个malloc分配的缓冲区。
  • 分配单个DatabaseInput时,很可能会出错,因为索引永远不会改变
db_input[0]= new DatabaseInput();

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

===编辑===

db_input = new DatabaseInput*[NUMB_SITES];

奏效了,谢谢加斯顿:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM