如何删除堆中返回的对象? [关闭]

问题描述 投票:0回答:1

例如

#include <iostream>

class JMP
{
    public:
        std::string number;
        JMP() {}
        JMP(const char* num) { number = num; }
        JMP& operator+(JMP &j)
        {
            // Allocate object
            JMP *sum_obj = new JMP("0");
            sum_obj->number[0] += 1;
            return *sum_obj;
        } // <--- memory leak
};

int main()
{
    JMP *a = new JMP(), *b = new JMP(), *c = new JMP();
    *c = *a + *b;
    delete a, b, c;
    return 0;
}

如何删除分配的

sum_obj
对象?

使用智能指针可以帮助这里吗?

注意:我正在做这个对象进行大量的数学计算,请不要建议使用堆栈内存

任何参考或有用的答案将不胜感激

c++ pointers memory-management memory-leaks heap-memory
1个回答
0
投票

首先,返回引用是错误的。你需要返回一个值。

其次,显而易见的解决方案是根本不使用动态内存,例如:

class JMP
{
    public:
        std::string number;
        JMP() {}
        JMP(const char* num) { number = num; }
        JMP operator+(const JMP &j)
        {
            JMP sum_obj("0");
            sum_obj.number[0] += 1;
            return sum_obj;
        }
};

不过,如果你真的需要用堆对象做计算,你可以这样做:

#include <memory>

class JMP
{
    public:
        std::string number;
        JMP() {}
        JMP(const char* num) { number = num; }
        JMP operator+(const JMP &j)
        {
            // Allocate object
            auto sum_obj = std::make_unique<JMP>("0");
            sum_obj->number[0] += 1;
            return *sum_obj; // returns a copy
        }
};
© www.soinside.com 2019 - 2024. All rights reserved.