【发布时间】:2019-12-26 13:42:38
【问题描述】:
如果我评论析构函数并打印“Hello world”,下面的代码可以正常工作 如果没有评论它只打印“你好”! 注意我在 windows xp 32bits 上使用 mingw 4.9 而且机器很旧 pintume 4 1.8ghz
奇怪的是这段代码在其他现代电脑上运行正常,我只在这台旧电脑上得到这个错误
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct String{
public:
String(const char * txt){
len = strlen(txt);
if (len > 0)
buffer = (char*) malloc(len);
strcpy(buffer,txt);
}
void add(const char * txt){
realloc(buffer,len+strlen(txt));
strcpy(buffer+len,txt);
len += strlen(txt);
}
~String(){ if (len > 0) free(buffer);} // if commented it works fine !!!
char* get_ptr(){ return buffer;}
private:
char * buffer;
int len;
};
int main(){
String s("Hello");
s.add(" World");
printf(s.get_ptr());
getchar();
}
【问题讨论】:
-
realloc不能以这种方式工作,您必须使用它的结果。此外,在 C++ 中使用 C 分配函数很奇怪。您还应该处理 len=0 的情况。 -
你是对的,但是我在两种方式上都得到了相同的结果,关于 c 分配函数,我认为如果只与基元类型一起使用就可以了
-
除了没有正确使用
realloc(),你没有分配正确的长度。要保存具有strlen()、strcpy()等函数的 C 样式字符串,必须为终止的 nul(值为'\0'的字节)包含空间,否则行为未定义。因此,您需要将传递给malloc()和realloc()的长度(由strlen()返回)加一。更好的是,使用标准库类型std::string而不是滚动您自己的字符串类型。
标签: c++