在linux中分配内存的问题

problem in allocating memory in linux

本文关键字:问题 内存 分配 linux      更新时间:2023-10-16

我用星号标记了产生问题的两行。

第一行为日志文件分配内存,这将在第二个带符号的行中使用。在第二签名行有一个分割错误的问题。这是由于没有分配"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, "%sx00", in_name);
    sprintf(ip, "%sx00", in_ip);
    port = in_port;
    sprintf(rcon, "%sx00", in_rcon);
    sprintf(logfile,"%sx00", 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;
}

我认为您正在尝试取消in_logfilein_rcon

这对printf不起作用,因为printf 首先需要以null结尾的字符串作为%s的参数。

charptr[known_length] = 0
相反,

这肯定不是答案,但是用c++开发将帮助您避免使用带类的C代码所遇到的内存问题。

使用std::string,那么复制它们将是微不足道的(与sprintf相比),并且它将更加安全。使用已弃用的char*会使事情变得混乱。

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

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

  2. 我没有看到创建和使用服务器对象的代码。是否可能是您创建了服务器对象,但随后对其进行了复制,并且由于没有正确实现复制语义而出现问题?