在linux中分配内存的问题

时间:2011-04-21 11:57:16

标签: c++ segmentation-fault

我与明星签署了造成问题的2行。

第一行为logfile分配内存,将在第二个签名行中使用。 在第二个签名行有一个分段错误的问题。 这是由于未分配“logfile”这一事实引起的。 我很确定这是因为如果我在load()中分配内存它就可以了。 但是我想在类的构造函数中分配内存,而不是在方法load()中分配内存。

我无法理解为什么它不起作用! 这是我第一次使用linux,所以也许我做错了什么!

谢谢你, 马可

    server::server(){
    port = 0;
    serverup = 0;
    loaded = 0;
    logfile = (char *) malloc(SERVER_PATHS_SIZE*sizeof(char)); //**************************** 
}

int server::load(int in_id, char *in_name, char *in_ip, int in_port,
                 char *in_rcon, char *in_logfile){

    int err;

    sprintf(name, "%s\x00", in_name);
    sprintf(ip, "%s\x00", in_ip);
    port = in_port;
    sprintf(rcon, "%s\x00", in_rcon);
    sprintf(logfile,"%s\x00", in_logfile); //**********************************

    err = urt.set(ip, port, rcon);
    if(err < 1){
        printf("server::load(): error from urt.set()\n");
        return 0;
    }

    printf("server::load(): server %d loaded!\n", id);
    loaded = 1;

    return 1;
}

3 个答案:

答案 0 :(得分:4)

我认为您正在尝试取消终止in_logfilein_rcon

这不适用于printf,因为printf 首先要求以空字符结尾的字符串作为%s的参数

charptr[known_length] = 0

代替

答案 1 :(得分:1)

这绝对不是一个答案,但使用C ++进行开发将帮助您避免使用C-with-classes代码时遇到的内存问题。

使用std :: strings,然后复制它们将是微不足道的(与sprintf相比),它将更安全。使用不推荐使用的char *会让人感到困惑。

一个好的副作用是你不需要手动分配内存(使用malloc或new),并消除任何内存泄漏的风险。

答案 2 :(得分:0)

  1. 我没有看到服务器类的析构函数。你有一个释放内存的析构函数吗?

  2. 我没有看到创建和使用服务器对象的代码。是否可以创建服务器对象,然后复制它,并且因为没有正确实现复制语义而出现问题?