buffer is allocated with new[], so it must be freed using delete[] instead of delete.
indicator is allocated with new, so it must be freed using delete and not delete[].
And there is no need to check for null, delete and delete[] already handle that for you:
void FreeColumns()
{
for (auto &column : columns)
{
delete[] column.buffer;
delete column.indicator;
}
}
That being said, you should use std::vector and std::unique_ptr, then you can get rid of FreeColumns() altogether and simply call columns.clear() when needed.
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);
...
}
}
2
solved Deleting allocated memory pointed by vector element crashes the program [closed]