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

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

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

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

代码语言:javascript
运行
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
运行
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
运行
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
运行
AI代码解释
复制
Matrix result(rows_, m.cols_);
// ....
return result;

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

代码语言:javascript
运行
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

复制
相关文章
jQuery 将时间戳转换为时间
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>时间戳转换为时间</title> <meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no"> </head> <body> <div id="rightalar
王小婷
2021/11/24
2K0
jQuery 将时间戳转换为时间
linux时间戳转换为时间_linux时间转换为时间戳
/*************************************************************************************
全栈程序员站长
2022/11/09
8.7K0
python将日期转换为时间戳_python – 将日期时间转换为时间戳,然后再返回
>>> local = datetime(2014, 1, 30, 23, 59, 40, 1999)
用户7886150
2021/01/19
3.6K0
Android 获取时间戳 和时间戳转日期
获取系统时间戳 public String getTime(){ long time=System.currentTimeMillis()/1000;//获取系统时间的10位的时间戳 String str=String.valueOf(time); return str; } 、获取系统时间 long currentTime = System.currentTimeMillis(); SimpleDateFormat formatter = new SimpleDateForma
程思扬
2022/01/10
7.1K0
时间戳转date
时间戳的长度是13时,才可以使用该方法,若长度为10,则时间精确到日期,在后面追加000,即可转化为date
week
2018/08/24
3.4K0
JS将日期转换为时间戳
1.getTime() 精确到毫秒 let date = new Date() let timeStamp = date.getTime() console.log(timeStamp) // 1606704849115 2.valueOf() 精确到毫秒 let date = new Date() let timeStamp = date.valueOf() console.log(timeStamp) // 1606704906237 3.parse() 精确到秒,毫秒会用000替代 let date
peng_tianyu
2022/12/15
13.6K0
java 时间戳字符串_Java获取当前时间戳/时间戳转换
public classApp {public static voidmain(String[] args) {//精确到毫秒//获取当前时间戳
全栈程序员站长
2022/08/11
8.6K0
时间戳转换为Date
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/149939.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/05
2.9K0
将时间戳转换为天,时,分
function time2string($second){ $day = floor($second/(360024)); $second = $second%(360024); // 除去整天之后剩余的时间 $hour = floor($second/3600); $second = $second%3600; // 除去整小时之后剩余的时间 $minute = floor($second/60); $second = $second%60; // 除去整分钟之后剩余的时间 // 返回字符串 return $day.’天’.$hour.’小时’.$minute.’分’; }
快乐的小白
2023/04/06
1.2K0
sql中时间戳转日期
需求: 我将博客和 typecho 后台结合起来,打算做一个在线说说的功能,在 typecho 中输入内容,然后调用接口,实现在我的博客查看说说功能的功能。是不是有点绕?我也这么觉得,但是折腾一下也挺好的。
子舒
2022/06/09
4.5K0
sql中时间戳转日期
linux 日期转换时间戳_将时间戳转为时间
最近项目上需要用到时间戳,查找了资源终于找到了实现方式,最后时间戳还需要转换成具体的日期格式,查阅了一些资料,还是没有找到具体的实现方式,所以这里总结一些,防止其他小伙伴就掉坑,实现是在freeRTOS系统上的,当前我在linux下尝试实现以下。
全栈程序员站长
2022/11/10
10.7K0
linux 日期转换时间戳_将时间戳转为时间
php中的时间戳与javascript中的时间戳的比较
php中的时间戳与javascript中的时间戳的比较,本质上看,它们是一样的东西,但如果二者要进行相等比较的时候,还是有点不同的,稍不注意,就会误入歧途,所以,这里列出容易忽略的两点不同,供大家参考:
风柏杨4711
2021/03/15
3.6K0
前端处理Json时间戳
今日在做后台时,用json将数据传递到前端后,发现时间字段被序列化了,所以需要处理后展示,我这里为了方便,所以丢到前端来处理了,方法如下:
Lcry
2022/11/29
1K0
前端处理Json时间戳
JS 时间转换为时间戳函数
在实际的项目中,一般都是数据库中存储的是时间戳,而页面上根据需要转换为时间。但是后端的同学直接写了一个时间存储了。给我的也是时间值。这我郁闷了,通过查阅资料,于是写了一个函数。
FungLeo
2022/05/05
8.7K0
Java 时间戳转date
时间戳的长度是13时,才可以使用该方法,若长度为10,则时间精确到日期,在后面追加000,即可转化为date
week
2022/11/26
3K0
jquery 时间戳转换为日期
1.转换为年月日 new Date(data.createDate).toLocaleDateString()//将json中的时间戳转换为年月日 2.精确到秒 function getMyDate
用户5899361
2020/12/07
4.3K0
MySQL时间戳转日期
FROM_UNIXTIME(unix_timestamp,format) 返回表示 Unix 时间标记的一个字符串,根据format字符串格式化。format可以包含与DATE_FORMAT()函数列出的条目同样的修饰符。下列修饰符可以被用在format字符串中: %M 月名字(January……December) %W 星期名字(Sunday……Saturday) %D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。) %Y 年, 数字, 4 位 %y 年, 数字, 2 位 %a 缩写的星期名字(Sun……Sat) %d 月份中的天数, 数字(00……31) %e 月份中的天数, 数字(0……31) %m 月, 数字(01……12) %c 月, 数字(1……12) %b 缩写的月份名字(Jan……Dec) %j 一年中的天数(001……366) %H 小时(00……23) %k 小时(0……23) %h 小时(01……12) %I 小时(01……12) %l 小时(1……12) %i 分钟, 数字(00……59) %r 时间,12 小时(hh:mm:ss [AP]M) %T 时间,24 小时(hh:mm:ss) %S 秒(00……59) %s 秒(00……59) %p AM或PM %w 一个星期中的天数(0=Sunday ……6=Saturday ) %U 星期(0……52), 这里星期天是星期的第一天 %u 星期(0……52), 这里星期一是星期的第一天 %% 一个文字“%”。
全栈程序员站长
2022/06/24
6K0
Golang将时间戳转为字符串
在golang里面获取时间戳并不难。只要加载time包。然后time.Now().Unix(),就可以了,但接下来转成string就麻烦了 本来,加载strconv的话,用strconv.Itoa也可以解决,但unixtime的时间戳是int64, itoa只能转32位的。这时候就只有一个恶心的办法了。 fmt.Sprintf("%d",int64),这个是肯定可以转,。。。。我现在就是用这种办法的 做个笔记 --EOF-- 后记,在群里问了一下,结果asta谢就说了。明明有strconv.FormatIn
李海彬
2018/03/20
3.1K0
Golang将时间戳转为字符串
在golang里面获取时间戳并不难。只要加载time包。然后time.Now().Unix(),就可以了,但接下来转成string就麻烦了 本来,加载strconv的话,用strconv.Itoa也可以解决,但unixtime的时间戳是int64, itoa只能转32位的。这时候就只有一个恶心的办法了。 fmt.Sprintf("%d",int64),这个是肯定可以转,。。。。我现在就是用这种办法的 做个笔记 --EOF-- 后记,在群里问了一下,结果asta谢就说了。明明有strconv.FormatIn
李海彬
2018/03/26
2.1K0
点击加载更多

相似问题

将json时间戳转换为标准java时间戳

25

将java时间戳字符串转换为java时间戳对象

213

将时间戳转换为postgres时间戳

20

将字符串(带时间戳)转换为pyspark中的时间戳

23

将44710.37680转换为可读时间戳

15
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档