我与明星签署了造成问题的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;
}
答案 0 :(得分:4)
我认为您正在尝试取消终止in_logfile
和in_rcon
这不适用于printf,因为printf 首先要求以空字符结尾的字符串作为%s的参数。
charptr[known_length] = 0
代替
答案 1 :(得分:1)
这绝对不是一个答案,但使用C ++进行开发将帮助您避免使用C-with-classes代码时遇到的内存问题。
使用std :: strings,然后复制它们将是微不足道的(与sprintf相比),它将更安全。使用不推荐使用的char *会让人感到困惑。
一个好的副作用是你不需要手动分配内存(使用malloc或new),并消除任何内存泄漏的风险。
答案 2 :(得分:0)
我没有看到服务器类的析构函数。你有一个释放内存的析构函数吗?
我没有看到创建和使用服务器对象的代码。是否可以创建服务器对象,然后复制它,并且因为没有正确实现复制语义而出现问题?