我是否正确释放了堆中的内存
Am I releasing the memory in the heap correctly?
我正在学习C/c++,我正在做的练习是创建一个计算算术表达式的程序。
为了完成这个练习,我需要一个通用的函数,它能够对字符串进行标记。由于要解析的字符串的大小在编译时未知,因此我必须在堆中动态分配一些数据。
工作完成后,堆中的内存可以被释放。
我的问题很简单:我释放内存正确吗?请在评论中提问。
标记功能char** Tokenize(const char delimiter, const char* string)
{
const char* pString = string;
char** tokens = new char*[strlen(string)];
char* buffer = new char[strlen(string)];
char* pointer = buffer;
int c = 0;
for (int k = 0; k < strlen(string); k++)
{
if (string[k] == delimiter)
{
buffer[k] = ' ';
tokens[c] = pointer;
pointer = buffer + k + 1;
c++;
continue;
}
buffer[k] = string[k];
}
tokens[c] = nullptr;
return tokens;
}
测试Tokenize函数并释放堆的主函数。
int main()
{
char** tokens = Tokenize('.', "192.168.1.1");
char** startTokensPointer = tokens;
char* startBufferPointer = *tokens;
while (*tokens != nullptr)
{
cout << *tokens << endl;
tokens++;
}
delete[] startTokensPointer; //Releases tokens??
delete[] startBufferPointer; //Releases buffer??
system("PAUSE");
}
您没有正确地释放buffer
。如果string
中没有一个字符等于delimiter
,则If语句中的代码:
if (string[k] == delimiter)
将永远不会执行,c
将保持0
。然后这一行:
tokens[c] = nullptr;
将tokens
中存储在startBufferPointer
中的第一个元素设置为nullptr
。在这种情况下,您正在泄漏buffer
,因为指向buffer
的指针在main
中被"遗忘"。
tokens
在所有情况下都正确释放
是的,没有内存泄漏,但是为什么不使用一个可以保证内存泄漏的类型呢?
struct Tokens
{
explicit Tokens(size_t len) : tokens(new char*[len]), buffer(new char[len])
{ }
std::unique_ptr<char*[]> tokens;
std::unique_ptr<char[]> buffer;
};
Tokens Tokenize(const char delimiter, const char* string)
{
auto len = strlen(string);
Tokens result(len);
char* pointer = result.buffer.get();
int c = 0;
for (size_t k = 0; k < len; k++)
{
if (string[k] == delimiter)
{
result.buffer[k] = ' ';
result.tokens[c] = pointer;
pointer = result.buffer.get() + k + 1;
c++;
continue;
}
result.buffer[k] = string[k];
}
result.tokens[c] = nullptr;
return result;
}
int main()
{
auto tok = Tokenize('.', "192.168.1.1");
char** tokens = tok.tokens.get();
while (*tokens != nullptr)
{
cout << *tokens << endl;
tokens++;
}
}
现在所有的内存都是自动管理的,几乎不可能泄漏。
相关文章:
- 我在二维向量中是否正确分配了内存
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 尽管遵循了规则,内存泄漏在哪里
- 了解 Linux 虚拟内存:valgrind 的 massif 输出显示了有和没有 --pages-as-heap 的主要差异
- 我可以将新的 std::tuple 放入内存映射区域,并在以后读回吗?
- 我刚刚了解了C++中的动态内存分配
- 我是否访问了已释放的内存,或者在这种情况下DrMemory报告不正确?
- FFMPEG,C++,内存泄漏,我做错了什么?
- 我在 2D 数组的动态内存分配中遇到了一些奇怪的代码C++? 请解释一下这是什么?
- 如果一个变量在它之前释放了另一个(相同的数据类型)变量,如何将其分配给内存?
- 理解C++内存顺序,我错了吗?
- 交换两个字符串时访问正确的内存时,我遇到了分段错误
- 为什么malloc()分配的内存超过了要求,以及我如何在Mac OS X中禁用malloc
- 调用JNI_CreateJavaVM函数后,应用程序内存增加了千兆字节
- 对象似乎正在删除自己,或者在构造函数之后内存发生了变化
- Ogre3D 1.9,cmake,XCode,不知道里面放了什么FREETYPE_FT2BUILD_INCLUDE_DIR
- 为什么这个程序会崩溃?我分配内存错了吗
- 全局分配的内存发生了什么
- 我拖放了一个Table View小部件(Qt).如何在填充元素后调整它的大小
- 内存泄露了吗?