gpt4 book ai didi

c++ - "Pointer being freed was not allocated"向存储添加元素时

转载 作者:行者123 更新时间:2023-11-28 02:55:40 25 4
gpt4 key购买 nike

每次我想将元素添加到存储类中的 std::map 时,我都会收到错误消息“未分配正在释放的指针”。我在构造函数和析构函数中添加了一些“couts”来调试,输出是:

新的德尔删除

所以看起来析构函数被调用了两次,在 main() 中和添加新元素时。

代码如下:

Container.h

#include <map>
#include "Element.h"

using std::map;

class Container
{
private:
map<string, Element> storage;

public:
Container();
~Container();

void add(Element e);
void remove(string s);

};

容器.cpp

#include "Container.h"

Container::Container()
{
}

Container::~Container()
{
}

void Container::add(Element e)
{
storage.insert(pair<string, Element>(e.getS(), e)); // CRASH
}

void Container::remove(string s)
{
storage.erase(s);
}

元素.h

#include <iostream>
#include <string>

using namespace std;

class Element
{
private:
string *s;

public:
Element();
Element(string s);

~Element();

string getS();
};

元素.cpp

#include <iostream>
#include "Element.h"


Element::Element()
{
s = new string("std cons");
std::cout << "new" << std::endl;
}

Element::Element(string s2)
{
s = new string(s2);

std::cout << "new" << std::endl;
}

Element::~Element()
{
std::cout << "del" << std::endl;
delete s;
}

string Element::getS()
{
return *this->s;
}

main.cpp

#include <iostream>
#include "Element.h"
#include "Container.h"

int main(int argc, const char * argv[])
{
Element e("l");
Container c;
c.add(e);

return EXIT_SUCCESS;
}

最佳答案

这里的问题是 Element 上有默认的复制构造函数。它本质上是对不分配新内存的字段进行成员复制。

Element e1("l");
Element e2(e1);

此时有 2 个 Element 值,但是 E::s 的内存只分配了一次。每个 Element 值都会尝试 free 内存,因此您最终会遇到双重 free 错误。

要解决此问题,您需要确保 Element 的每个拷贝都有自己的内存拷贝来管理

Element::Element(Element& other) 
{
s = new string(other.s);
}

或者更好的是只按值保存 Element:s

class Element
{
string s;
...
};

关于c++ - "Pointer being freed was not allocated"向存储添加元素时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22055501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com