首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何使用重载操作符修复此内存泄漏?

如何使用重载操作符修复此内存泄漏?
EN

Stack Overflow用户
提问于 2019-04-19 17:19:32
回答 1查看 193关注 0票数 0

我一直在从C++ Super-FAQ的“运算符重载”部分扩展Matrix类。我通过Valgrind运行我的程序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
==6208== 48 (16 direct, 32 indirect) bytes in 1 blocks are definitely lost in loss record 5 of 6
==6208==    at 0x4C3017F: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==6208==    by 0x108E98: Matrix::operator*(Matrix&) (in /home/l/a.out)
==6208==    by 0x1090BA: main (in /home/l/a.out)
==6208== 
==6208== 48 (16 direct, 32 indirect) bytes in 1 blocks are definitely lost in loss record 6 of 6
==6208==    at 0x4C3017F: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==6208==    by 0x108FC2: Matrix::transpose() const (in /home/l/a.out)
==6208==    by 0x108EC2: Matrix::operator*(Matrix&) (in /home/l/a.out)
==6208==    by 0x1090BA: main (in /home/l/a.out)

我可以看到问题出在operator*中。我对这个运算符的实现如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Matrix &Matrix::operator*(Matrix &m) {
    auto result = new Matrix(rows_, m.cols_);
    auto &mTranspose = m.transpose();
    for (unsigned i = 0; i < rows_; ++i) {
        for (unsigned j = 0; j < m.cols_; ++j) {
            result->data_[i][j] = std::inner_product(data_[i], data_[i] + cols_, mTranspose.data_[j], 0);
        }
    }
    return *result;
}

我使用类似于以下示例main()中所示的模式调用操作符

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main() {
    Matrix m(2,2);
    Matrix n(2,2);

    auto &a = m * n; // pattern A
    auto * b = &(m*n); // pattern B

我在操作符中分配堆上的对象的原因是,我需要在乘法完成后保持Matrix乘法的结果;在我的程序的其他地方,我使用一个循环,在那里我需要跟踪以前的Matrix乘法。

我如何修复这个内存泄漏?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-19 17:27:42

只需声明一个局部变量,然后返回它。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Matrix result(rows_, m.cols_);
// ....
return result;

当你使用它的时候,就像对实数乘法一样使用它。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
auto a = m * n;    // Not a reference
auto b = m * n;    // Not a pointer

根据m.transpose()返回的内容,转置可能需要为auto mTranspose = m.transpose(); (即,不是引用)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55765456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文