所以我遇到了一个家庭作业的问题 - 因为getApple
是const,我不能设置locallyAllocated = false
,这意味着只要在实例化的情况下调用getApple
并且在其他程序中释放,我的析构函数尝试释放内存并抛出双重自由错误。我做错了什么,我怎么能解决它?注意:函数,它们的参数和签名必须是我们分配的方式。非常感谢!
class poop
{
Apple localApple;
bool locallyAllocated;
void* pointer;
public:
poop(const Apple &apple)
{
//Set our local apple to the apple in the provided address
localApple = apple;
locallyAllocated = false;
}
poop(string descr)
{
localApple.description = descr;
pointer = maloc(sizeof(localApple);
localApple.pointer = pointer
locallyAllocated = true;
}
~poop()
{
if(locallyAllocated)
{
//This throws a double free error if "getApple" is ever called
free(pointer);
}
}
void getApple(Apple* apple) const
{
if(apple)
{
//Copies our local apple into the address of the given apple
//Because this function is "const", i can't do anything like set "locallyAllocated" to false
*apple = localApple
}
}
}
答案 0 :(得分:0)
你有一些不安全的东西在这里......特别是:
poop(const Apple &apple)
{
//Set our local apple to the apple in the provided address
localApple = apple;
locallyAllocated = false;
}
这意味着某人可能会从您身下释放apple.pointer
,这意味着您的localApple.pointer
无效。您也应该在该方法中执行alloc和memcpy数据。
然而,这里有一个更大的问题......你实际上甚至没有使用.pointer
。你甚至需要分配任何东西吗?你对指针的意图是什么?
如果您对自己的课程感到满意,则应该查看mutable关键字。
答案 1 :(得分:0)
通过将locallyAllocated
声明为mutable
,您将能够在const方法中更改其值。另一个最糟糕的解决方案是将locallyAllocated
存储为动态分配的布尔值。
答案 2 :(得分:0)
我的第一直觉是建议你使用共享指针
http://en.cppreference.com/w/cpp/memory/shared_ptr
但是,如果您确实需要自己跟踪分配,则应使localAllocated变为可变。在非专业术语中,这意味着即使在标记为const的方法中也可以更改成员(它允许您在打破'物理'常量时保持逻辑常量)。
答案 3 :(得分:0)
对我来说,你的问题似乎是几个苹果应该共享同一个对象,由Apple::pointer
指向。但是,这并未在您的代码中明确说明。 那就是问题。
没有适合各地的内存管理的最终规则。但是,有一些方法可以反映Apple::pointer
所指向的对象的共享所有权(假设它的大小也是苹果?)。
Apple::Apple(Apple const&)
,它负责复制指向的对象。请注意,您的locallyAllocated
成员是智能指针的简化版本。