将内存分配给空类会导致内存泄漏吗?
Does allocating memory to an empty class casues memory leak?
以下函数出现在OctoMap代码中:
class AbstractOcTreeNode {};
-> 他们声明了一个空类
AbstractOcTreeNode** children;
-> 这是在OcTreeDataNode
类头文件中声明
template <typename T>
void OcTreeDataNode<T>::allocChildren() {
children = new AbstractOcTreeNode*[8];
for (unsigned int i=0; i<8; i++) {
children[i] = NULL;
}
}
这不会导致内存泄漏吗?不应该是:
template <typename T>
void OcTreeDataNode<T>::allocChildren() {
children = new AbstractOcTreeNode*[8];
for (unsigned int i=0; i<8; i++) {
delete children[i];
children[i] = NULL;
}
}
我错过了什么?感谢您的帮助!
您希望删除整个数组,而不是每个单独的数组元素
template <typename T>
void OcTreeDataNode<T>::allocChildren() {
children = new AbstractOcTreeNode*[8];
for (unsigned int i=0; i<8; i++) {
children[i] = NULL;
}
// .... later
delete[] children ;
}
你必须始终将new
与delete
匹配,将new[]
与delete[]
匹配,而不是将它们混合。
为了完整性(我猜上下文(,因为函数的名称是allocChildren
我认为他们的意图是new[]
数组而不是清理内存。希望以后能有一个匹配的deallocChildren
delete[]
这段记忆。
分配内存并立即删除它有什么意义?
template <typename T>
void OcTreeDataNode<T>::allocChildren() {
children = new AbstractOcTreeNode*[8];
for (unsigned int i=0; i<8; i++) {
delete children[i];
children[i] = NULL;
}
}
上面的函数没有意义。
请注意,空类具有非零大小。
并且分配了一个指向空类的指针数组。 此函数中未分配类的对象。
在此函数中
template <typename T>
void OcTreeDataNode<T>::allocChildren() {
children = new AbstractOcTreeNode*[8];
for (unsigned int i=0; i<8; i++) {
children[i] = NULL;
}
}
命名空间中定义的变量children
获取成员函数中分配数组的地址。
因此,其他一些代码负责释放分配的内存。
通常,类的成员函数使用全局变量是一个坏主意。
AbstractOcTreeNode** children;
children
可以看作是一个指针值数组。
children = new AbstractOcTreeNode*[8];
我们用一个包含八个指针值的数组初始化它。
for (unsigned int i=0; i<8; i++) { children[i] = NULL; }
八个children[i]
指针值中的每一个最初都是未初始化的AbstractOcTreeNode*
。我们将NULL
值分配给它们中的每一个。事先在这些未初始化的指针上调用delete
将是未定义的行为。
只有一个内存分配(new[]
只调用一次(,其结果保存在children
中。只要最终清理children
就没有泄漏(使用delete[]
,大概在OcTreeDataNode<T>
的析构函数中(。
您的困惑是拥有多个级别的指针的结果,至少其中一些是拥有的。因此,我个人也发现这段代码很难阅读。在现代C++中,您不会执行手动内存管理,无论是用于分配指针数组(std::vector
或std::array
(,还是用于分配每个AbstractOcTreeNode
派生实例(此处未显示(。您可能会在现代C++中找到std::vector<std::unique_ptr<AbstractOcTreenode>> children;
。
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 尽管遵循了规则,内存泄漏在哪里
- 为什么调用堆栈数组会导致内存泄漏
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 使用模板类的自定义列表类型中的内存泄漏
- 为什么以下C++代码中存在内存泄漏?
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 我是否生成线程并导致内存泄漏?
- 多线程程序中出现意外的内存泄漏
- 为什么此函数会导致内存泄漏?
- 在 C++ 库中使用cythonized python时内存泄漏
- 需要帮助查找内存泄漏
- 瓦尔格林德的内存泄漏使用新的
- 无法找出我的代码中的内存泄漏
- C++ 结构内部的unordered_map会导致内存泄漏问题吗?
- 可视化 使用 VS Code 查找C++应用程序中的内存泄漏
- Shared_ptr双链接列表内存泄漏
- C++ 在类中使用常量引用文本时 O2 内存泄漏