C ++ char分配

时间:2014-05-13 06:43:56

标签: c++ memory char

我正在使用这样的东西:

char* s = new char;
sprintf(s, "%d", 300);

这有效,但我的问题是为什么?

当我尝试删除它时,我收到错误,因此会产生内存泄漏。

2 个答案:

答案 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 ++不进行缓冲区溢出检查......所以它一直有效,直到它没有......