2011-04-21 111 views
0

我使用星号签署了造成问题的两行。在linux中分配内存的问题

第一行为日志文件分配内存,该内存将用于第二个已签名的行。 在第二个签名行存在分段错误问题。 这是由于“日志文件”未分配的事实造成的。 我很确定这是因为如果我在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; 
} 
+2

请将您的代码缩减为可用于演示问题的可运行(即可编译,可运行)示例。否则,我们只能猜测问题出在哪里... – sleske 2011-04-21 12:06:21

+0

我们看不到'logfile'在哪里声明。它是类服务器的成员变量吗?它是全球性的吗?让你的例子独立编译对调试至关重要。 – DevSolar 2011-04-21 12:20:25

+0

当编程C++时,'new'通常比'malloc'更受欢迎 – knittl 2011-04-21 12:26:28

回答

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

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

+0

(2)不,它不能,因为(1)。 :) – 2011-04-21 12:41:30

+0

黑暗的猎鹰,你是一个天才!这是问题!非常感谢! – Marco 2011-04-22 01:36:05

+0

基本上没有调用构造函数......可能我是以错误的方式创建服务器对象! 感谢所有的答复! – Marco 2011-04-22 01:39:29

4

我认为你正试图nullterminate in_logfilein_rcon

因为printf的需要摆在首位null结尾的字符串作为参数%s的这不会printf的工作。

charptr[known_length] = 0 

代替

+1

为了稍微说明一下,出现了段错误,因为原始输入到'sprintf'中缺少空终止导致数据通过原始输入的末尾被读取,导致无效读取。此外,你然后试图分配更多的数据到输出数组比你想象的,导致无效的写入。 – 2011-04-21 12:40:29

1

这绝对不是一个答案,但在C++深化发展将帮助你避免你和你的C-与类代码获取内存问题。

使用std :: strings,然后复制它们将是微不足道的(与sprintf相比),它会更安全。使用弃用的char *会让事情变得混乱。

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

+0

不推荐使用'char *'来处理字符数组。 (尽管将字符串字面值绑定到char *而不是char const *)。 – 2011-04-21 12:41:04