我正在使用这样的东西:
char* s = new char;
sprintf(s, "%d", 300);
这有效,但我的问题是为什么?
当我尝试删除它时,我收到错误,因此会产生内存泄漏。
答案 0 :(得分:4)
它“有效”,因为sprintf
期望char*
作为它的第一个参数,而你正在给他什么。
但是,您确实刚刚分配了一个 char
,因此向其中写入多个char
未定义的行为。根据...编译器,主机架构等,可能会分配多个字节,但您不能依赖它。实际上,任何都可能发生,你不希望基于这样的假设建立你的代码。
为字符串缓冲区分配更多空间,或者更好地使用更“现代”的方法。在你的情况下,它可能是这样的:
std::string s = std::to_string(300);
// Or, C++03
std::string s = boost::lexical_cast<std::string>(300);
(我们不是在谈论性能,但最初的代码不正确,我们无论如何都难以比较。)
作为一个额外的好处,这段代码不泄漏任何内存,因为std::string
负责在销毁时释放内部内存(s
在堆栈上分配,这将自动发生超出范围)。
答案 1 :(得分:0)
你正在创建一个char缓冲区,然后用四个字符写入它(&#34; 300 \ 0&#34;)[不要忘记字符串终止],所以& #39; 3&#39;进入你分配的记忆和&#39; 0&#39;和&#39; 0&#39;和&#39; \ 0&#39;进入下一个记忆位置......属于别人。
C ++不进行缓冲区溢出检查......所以它一直有效,直到它没有......