如何知道何时释放记忆?

时间:2013-10-03 11:28:04

标签: c++ pointers memory malloc const

所以我遇到了一个家庭作业的问题 - 因为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
        }
    }
}

4 个答案:

答案 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&),它负责复制指向的对象。
  • 如果要保留共享所有权,请使用std::shared_ptr而不是原始指针。这将负责从肩膀上删除指向的物体。 “离开的最后一道关上了门。”

请注意,您的locallyAllocated成员是智能指针的简化版本。