删除矢量元素指向的已分配内存会导致程序崩溃
Deleting allocated memory pointed by vector element crashes the program
我正在编写一个动态程序,该程序将读取Oracle数据库元数据并在内存中构建其结构。
当我释放创建为new
的内存来保存Oracle发送给我的数据时,我遇到了一个问题。这个结构被放在一个向量中,运行良好(我可以读取和处理它)。
这是我的代码(数据库内容被删除是为了关注这个问题):
struct OracleColumnStruct {
std::string name;
ub2 ociType;
FieldType fieldType;
int size;
char *buffer;
sb2 *indicator;
OCIDefine *defineHandler;
};
std::vector<OracleColumnStruct> columns;
void AllocateColumns()
{
columnCount = ... // whatever from database
for (unsigned int i = 0; i < columnCount; i++)
{
ociType = ... // whatever from database
size = ... // whatever from database
OracleColumnStruct data;
data.name = "whatever";
data.ociType = ociType;
data.size = size;
data.buffer = new char[size];
data.indicator = new sb2;
columns.push_back(data);
}
}
void FreeColumns()
{
for (auto &column : columns)
{
if (column.buffer)
delete column.buffer; <<<- Crash here on 2nd interaction
if (column.indicator)
delete column.indicator;
}
}
崩溃消息:
HEAP CORRUPTION DETECTED: after Normal block (#16497) at 0x00261940.
CRT detected that the application wrote to memory after end of heap buffer.
当我需要释放结构时,它会释放第一个元素,在第二次处理时,向量似乎会丢失。
删除指针引用会混淆整个向量吗?在这种情况下该怎么办?
buffer
是用new[]
分配的,因此必须使用delete[]
而不是delete
来释放它。
indicator
是用new
分配的,因此必须使用delete
而不是delete[]
来释放它。
不需要检查null,delete
和delete[]
已经为您处理了:
void FreeColumns()
{
for (auto &column : columns)
{
delete[] column.buffer;
delete column.indicator;
}
}
也就是说,您应该使用std::vector
和std::unique_ptr
,然后您可以完全摆脱FreeColumns()
,并在需要时简单地调用columns.clear()
。
struct OracleColumnStruct {
std::string name;
ub2 ociType;
FieldType fieldType;
std::vector<char> buffer;
std::unique_ptr<sb2> indicator;
OCIDefine *defineHandler;
};
void AllocateColumns
{
columnCount = ... // whatever from database
for (unsigned int i = 0; i < columnCount; i++)
{
...
OracleColumnStruct data;
data.name = "whatever";
data.ociType = ociType;
data.buffer.resize(size);
data.indicator.reset(new sb2);
// or: data.indicator = std::make_unique<sb2>();
columns.push_back(data);
...
}
}
如果您已经在数组形式中分配了new
char* buffer = new char[size];
那么你应该使用delete的数组形式来删除
delete[] buffer;
相关文章:
- 使用 g++7 构建的代码在访问未对齐的内存时崩溃
- 如何避免由于内存不足而导致 gcc 崩溃
- 媒体基础 多个视频播放导致内存泄漏和崩溃
- 无法避免的libxml2内存泄漏是由于尝试清理时崩溃造成的
- 分配内存并在回调时调用C++的 Rust 函数崩溃
- STD :: FSTREAM在使用预先分配的内存时在Main之后崩溃
- 是否有可能存在不会崩溃程序的内存问题
- 内存相关崩溃:Cocos2d游戏中的三维数组
- 复制赋值构造函数中的aligned_alloc内存块在释放时崩溃
- 外档导致违反内存的崩溃
- C++ 分配器在内存不足时使应用程序崩溃
- C 程序在出口时崩溃,内存中的访问违规
- 由于#Pragma Pack错误而导致的内存损坏 - std Map损坏 - 插入上崩溃
- C++ 尝试通过内存中的地址调用函数时程序崩溃(如何修复?
- 开发C++在运行大内存程序时崩溃
- 如果在进程崩溃后在进程中分配内存,会发生什么情况
- C++程序崩溃(与动态内存有关)
- 删除矢量元素指向的已分配内存会导致程序崩溃
- C++中的共享内存崩溃
- 动态数组和操作符重载会导致内存崩溃