【发布时间】:2016-08-09 21:21:48
【问题描述】:
如果我提供一个长度为 64 个字符的十六进制字符串(即:26C8D8AB82B027808A371BC46EA789364AB8419F2B17EADFE955CBE5C6369011),以下代码将引发错误,即使我为其分配了 64 * sizeof(char) 字节,这应该是够了:
char* username = (char*)malloc(64 * sizeof(char));
std::cin >> username;
free(username);
当我释放分配的内存时,在第三行抛出错误:
CRT 检测到应用程序在堆结束后写入内存 缓冲区。
这不会发生在 63 个字符或更少的情况下。谁能告诉我为什么 64 * sizeof(char) 是不够的,为什么在释放内存时会抛出错误而不是之前...
【问题讨论】:
-
@TimStraubinger std::malloc 当然是 C++ ......但你是对的,它不应该在没有充分理由的情况下使用(例如需要将分配所有权传递给 C 代码)。
-
@TimStraubinger 是一样的,new[] 和 free() 给出相同的结果。但是,删除不会引发错误。不过谢谢你的建议。
-
@TimStraubinger ...什么?
new和delete也不应该被推荐用于一般用途,因为 stdlib 提供了这么多处理动态分配的安全类,因此用户不必这样做。多态性也不需要动态分配,这就是我假设你试图用“oop-style objects”说的(如果我听说过,这是一个重言式);只需要一个指针或引用,并且目标可以在堆栈上。如果您要向新用户推荐东西,请推荐好东西。 -
@underscore_d:我认为 Tim 区分了 POD(普通旧数据),其中
malloc()和free()可以安全使用,与具有非平凡构造的“对象”,其中 @ 987654326@ 给出的结果还不是一个有效的对象。多态性不是其中的一部分。 -
@MikeMouawad:你不知道关于抛出错误的说法有多准确。这主要是
malloc和new之间 C++ 代码的区别(除了为非普通旧数据类型调用 ctor / dtor)。如果失败会抛出异常。
标签: c++ visual-c++ memory-management console-application