提问者:小点点

具有动态分配字符数组C++结构


我试着在向量中存储结构。 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

是的,好像析构函数被调用了两次! 一次是在向量添加时,第二次是在程序执行完毕时。

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

有人能解释一下为什么会出现这种情况吗?有哪些可能的方法可以正确地完成我的任务?


共1个答案

匿名用户

@lpvoid

使用emplace_back(。。) 在适当的位置创建对象可以帮助您避免在这里面临的双重释放或损坏错误。

m_classrooms.emplace_back(29)

然而,始终遵循3/5/0的规则以不以悬空指针结束是一种更好的实践。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(动态分配|字符|数组|c++|结构)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?