1

所以我遇到了家庭作业的问题 - 因为getApple是 const,我无法设置locallyAllocated = false,这意味着每当getApple在其他程序中实例化并释放苹果时,我的析构函数都会尝试释放内存并抛出一个 double免费错误。我做错了什么,我该如何解决?注意:函数,它们的参数和签名必须是我们分配的方式。非常感谢!

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

4 回答 4

0

通过声明locallyAllocatedasmutable您将能够在 const 方法中更改其值。另一个最糟糕的解决方案是将存储locallyAllocated为动态分配的布尔值。

于 2013-10-03T11:38:46.363 回答
0

我的第一反应是建议你使用共享指针

http://en.cppreference.com/w/cpp/memory/shared_ptr

但是,如果您确实需要自己跟踪分配,则应该将 localAllocated 设为可变。用外行的话来说,这意味着即使在标记为 const 的方法中也可以更改成员(它允许您在破坏“物理” const 的同时保持逻辑 const )。

于 2013-10-03T11:41:45.000 回答
0

对我来说,您的问题似乎是几个苹果应该共享同一个对象,由Apple::pointer. 但是,这在您的代码中没有明确说明。这就是问题所在。

没有适用于任何地方的内存管理的最终规则。但是,有一些方法可以反映您对所指向的对象的共享所有权Apple::pointer(我假设这也是一个苹果,考虑到它的大小?)。

  • 您可以做的一件事是编写一个适当的复制构造函数Apple::Apple(Apple const&),负责复制指向的对象。
  • 如果要保留共享所有权,请使用std::shared_ptr而不是原始指针。这将负责从您的肩膀上删除指向对象。“最后一个离开的关门。”

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

于 2013-10-03T11:43:55.533 回答
0

您在这里发生了一些不安全的事情..特别是:

poop(const Apple &apple)
{
    //Set our local apple to the apple in the provided address
    localApple = apple;
    locallyAllocated = false;
}

这意味着有人可能会apple.pointer从你身下解放出来,这意味着你localApple.pointer将是无效的。您也应该在该方法中执行分配并 memcpy 数据。

但是,这里有一个更大的问题......你实际上甚至没有使用.pointer. 你甚至需要分配任何东西吗?你的指针的意图是什么?

如果你对你的类感到满意,你应该检查mutable关键字。

于 2013-10-03T11:37:46.180 回答