C++ 删除向量元素指向的已分配内存会使程序崩溃

C++ 删除向量元素指向的已分配内存会使程序崩溃,c++,vector,C++,Vector,我正在编写一个动态程序,它将读取Oracle数据库元数据并在内存中构建其结构 当释放作为new创建的内存以保存Oracle发送给我的数据时,我面临一个问题。该结构放在一个向量中,运行良好(我可以读取和处理它) 以下是我的代码(数据库内容因关注问题而被删除): 当我需要释放结构时,它释放第一个元素,在第二次处理时,向量似乎丢失了 删除指针引用是否会混淆整个向量?在这种情况下,应该怎么做?如果您以数组形式分配了带有new的内容 char* buffer = new char[size]; 然后应该

我正在编写一个动态程序,它将读取Oracle数据库元数据并在内存中构建其结构

当释放作为
new
创建的内存以保存Oracle发送给我的数据时,我面临一个问题。该结构放在一个向量中,运行良好(我可以读取和处理它)

以下是我的代码(数据库内容因关注问题而被删除):

当我需要释放结构时,它释放第一个元素,在第二次处理时,向量似乎丢失了


删除指针引用是否会混淆整个向量?在这种情况下,应该怎么做?

如果您以数组形式分配了带有new的内容

char* buffer = new char[size];
然后应该使用delete的数组形式进行删除

delete[] buffer;

buffer
是用
new[]
分配的,因此必须使用
delete[]
而不是
delete
来释放它

指示器
分配了
新的
,因此必须使用
删除
而不是
删除[]
来释放它

无需检查null,
delete
delete[]
已经为您处理了:

void FreeColumns()
{
    for (auto &column : columns)
    {
        delete[] column.buffer;
        delete column.indicator;
    }
}
这就是说,您应该使用
std::vector
std::unique\u 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);
       ...
    }
}
struct OracleColumnStruct{
std::字符串名;
ub2型;
字段类型字段类型;
向量缓冲区;
标准:唯一的ptr指示器;
OCIDefine*defineHandler;
};
无效分配列
{
columnCount=…//数据库中的任何内容
for(无符号整数i=0;i
downvorters,请解释……您的问题不符合要求。这就是它被否决的原因。此外,抱怨被否决本身也会得到否决票。没有抱怨,但尝试从错误中吸取教训…这表明某些内容写入了
列的末尾。缓冲区
,在您尝试释放它之前,没有检测到它。
列.buffer
用于什么?Remy,将
delete
更改为
delete[]
并没有解决问题。。。这里还发生了其他事情…@Mendes那么你没有正确管理指针,或者你是ovwrwritibg内存。但是,您没有显示足够的代码来以这种或那种方式进行诊断。这就是为什么你应该避免使用原始指针,而不是使用容器,让C++管理内存。从<代码>删除>代码>到代码>删除[]/COD> >并没有解决问题。这里还有别的事情。。。
void FreeColumns()
{
    for (auto &column : columns)
    {
        delete[] column.buffer;
        delete column.indicator;
    }
}
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);
       ...
    }
}