具有动态分配的char数组的C ++结构

问题描述 投票:1回答:1

我正在尝试将结构存储在向量中。 Struct需要为给定大小的char *动态分配内存。但是,一旦我将结构添加到向量中,它的析构函数就会被调用,好像我失去了指向它的指针一样。

为了示例,我做了这个小演示。

#include "stdafx.h"
#include <iostream>
#include <vector>

struct Classroom
{
    char* chairs;

    Classroom() {} // default constructor

    Classroom(size_t size)
    {
        std::cout << "Creating " << size << " chairs in a classroom" << std::endl;
        chairs = new char[size];
    }

    ~Classroom()
    {
        std::cout << "Destroyng chairs in a classroom" << std::endl;
        delete[] chairs;
    }
};

std::vector<Classroom> m_classrooms;

int main()
{

    m_classrooms.push_back(Classroom(29));
    //m_classrooms.push_back(Classroom(30));
    //m_classrooms.push_back(Classroom(30));

    system("Pause");

    return 0;
}

输出为

Creating 29 chairs in a classroom
Destroyng chairs in a classroom
Press any key to continue . . .
Destroyng chairs in a classroom

是的,似乎析构函数被调用了两次!一次添加到向量,第二次在程序完成其执行时。

当我尝试使用类而不是结构时,发生了完全相同的事情。

有人可以解释为什么会发生这种情况,以及正确完成我的任务的可能方法是什么?

c++ memory-management struct dynamic destructor
1个回答
0
投票

@ LPVOID

使用emplace_back(..)在适当位置创建对象可以帮助您避免此处遇到的double free or corruption错误。

m_classrooms.emplace_back(29)

但是,最好始终遵循3/5/0的规则,以不以悬空指针结尾。

© www.soinside.com 2019 - 2024. All rights reserved.