new-正在学c++, class内存分配的问题

问题描述

正在学c++, class内存分配的问题

重载
Matrix& Matrix::operator-(const Matrix &m) {
if (m.row_n != row_n||m.column_n != column_n) {
std::cout << "Size not matching, can't add!" << std::endl;
std::cout << "the left is returned" << std::endl;
return this;
}
static Matrix temp(row_n, column_n); //这里这个分配的内存什么时候删除?
temp.name = 'f';
for (int i = 0; i < row_n; i++) {
for (int j = 0; j < column_n; j++) {
temp.element[i][j] = element[i][j] - m.element[i][j];
}
}
return temp;
}
构造函数::
Matrix::Matrix() {
row_n = 2;
column_n = 2;
element = ( int *
)new int* [2];
for (int i = 0; i < 2; i++) {
element[i] = new int2;
element[i][i] = 1;
}
row_n = 2;
column_n = 2;
}

重载

Matrix& Matrix::operator=(const Matrix &mp) {
row_n = mp.row_n;
column_n = mp.column_n;
for (int i = 0; i < row_n; i++) {
delete[] element[i];
}
delete[] element;
element = (int **)new int*[mp.row_n];
for (int i = 0; i < column_n; i++)
element[i] = new int[mp.column_n];
for (int i = 0; i < row_n; i++)
for (int j = 0; j < column_n; j++)
element[i][j] = mp.element[i][j];
return *this;
}

使用::
Matrix ma1, temp;
temp = ma1 - ma5;
错误::
*** Error in `./temp': double free or corruption (out): 0x0000000000f62090 ***
已放弃 (核心已转储)
一直找不到原因,希望高手能指点一下

解决方案

double free就是你的代码有多次重复是否同一个指针。
operator中没必要是否mp的指针,而是的放到析构函数中。

解决方案二:

你这个是编译器静态分配的,又是静态变量,永远都不会被删除
只有new malloc分配的才谈得上删除,静态分配在堆栈上的会在函数退出的时候析构

解决方案三:

请问那应该怎样分配才能保证重载的"="赋值成功, 因为这个局部的对象的内存也是动态分配的,
,还有那个error什么意思,不明白

时间: 2024-12-27 16:01:54

new-正在学c++, class内存分配的问题的相关文章

[jjzhu学java]之深入理解JVM之垃圾收集器与内存分配策略

深入理解JVM之垃圾收集器与内存分配策略 如何判断对象已经消亡 引用计数算法 根搜索算法 引用 深入理解JVM之垃圾收集器与内存分配策略 java中对象的创建需要的内存都是在java堆中申请的,所以垃圾收集的区域就是对java堆和方法区的内存区域进行GC. 如何判断对象已经消亡 垃圾收集器的主要任务就是找出已经"消亡"的对象,将其标记并清除其说用内存的过程,如何判断某个对象已经"消亡",不同的虚拟机有不同的判断策略 引用计数算法 引用计数(Reference Cou

再探Java内存分配

自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程03–onLayout源码详尽分析 自定义View系列教程04–Draw源码分析及其实践 自定义View系列教程05–示例分析 自定义View系列教程06–详解View的Touch事件处理 自定义View系列教程07–详解ViewGroup分发Touch事件 自定义View系列教程08–滑动冲突的产生及其处理

初学者对于java继承、多态,子类对象的内存分配的一些问题,百度了好多,但感觉没有系统的,在此提问,希望前辈们传到授业解惑

问题描述 由于是初学者,所以有些表述可能有误,都只是自己的一些理解.我是纯初学者,看过两个星期的C++,之前也学过C.感觉看C++的时候,更容易去理解C++中的面向对象技术的实现,但看JAVA的时候,可能隔着一层虚拟机,有些实现很难理解.第一个问题:我了解到一个对象里面,隐含了一个引用this,可以用this来特别地引用本对象的成员或者函数,然后还有一个super关键字,书上说这个关键字不是一个引用,但怎么看都感觉这个super是一个指向本对象的父类类型的引用.我想问这个super到底是什么,如

为什么不能再构造函数中执行大量的内存分配、文件读写等复杂操作??

问题描述 为什么不能再构造函数中执行大量的内存分配.文件读写等复杂操作?? 大婶们啊:为什么不能再构造函数中执行大量的内存分配.文件读写等复杂操作??? 解决方案 可以啊!谁告诉你不行的? 只是在构造函数做太复杂的操作,当出错时发现错误有时会很困难.特别是定义为全局变量时,程序还没有运行.就出错了. 解决方案二: 构造函数主要进行一些初始化工作,复杂的工作放到成员函数中处理,这样比较符合OOP设计 解决方案三: 以牺牲对象分配的时间来换取代码的简单行· 是可以的·! 但是不推荐 解决方案四: 这

关于Java 数组内存分配一点认识

 可能Java 数组大家都很熟悉,最近我遇到了一个关于Java 数组内存分配的问题.         呵呵.突然就发现许多书上"基本数据类型存储在栈内存当中,对象则保存在堆内存"这句话完全是错误的.下面是个简单的例子代码: public class Test { public static void main(String[] argv) { // 静态初始化数组 String[] names = { "Michael", "Orson", &q

Linux内核中常见内存分配函数(三)

ioremap void * ioremap (unsigned long offset, unsigned long size) ioremap是一种更直接的内存"分配"方式,使用时直接指定物理起始地址和需要分配内存的大小,然后将该段 物理地址映射到内核地址空间.ioremap用到的物理地址空间都是事先确定的,和上面的几种内存 分配方式并不太一样,并不是分配一段新的物理内存. ioremap多用于设备驱动,可以让CPU直接访问外部设备的IO空间.ioremap能映射的内存由原有的物理

《unix设备驱动》内存分配

这里只简单介绍一下内核中提供的一些内存管理接口,方便内核开发入门人员对内存管理有一个大致的了解,也方便自己以后复习   Kmalloc   分配的区域在物理内存中式连续的 函数原型:void * kmalloc(size_t size ,int flags)不同的标志可以以不同的方式控制kmalloc的行为 比如是内核内存的分配还是用户空间内存分配,分配过程中是否可以休眠等等   内核把内存分为三个区段: 可用于DMA的内存 常规内存 高端内存   物理内存只能按照页面进行分配 只能分配一些预定

VC6下使用STL注意:不要让内存分配失败导致您的旧版STL 应用程序崩溃

大多数 C++ 开发人员在他们的代码中都广泛使用了标准模块库 (STL).如果您是其中的一员,并且正在直接使用即装即用的 STL 和 Visual C++ 6.0,则在内存不足的条件下,您的应用程序就处于崩溃的高度危险的状况下.产生此问题的原因是,检查运算符 new 是否失败是一种非常少见的做法.更糟糕的是,当 new 确实失败时,响应不是标准的.有些语言编译器返回 NULL,而其他语言则引发异常. 另外,如果您正在 MFC 项目中使用 STL,要注意 MFC 有其自己的规则集.本文将讨论这些问

RAMCloud:内存云存储的内存分配机制

现在全闪存阵列已经见怪不怪了,EMC的XtremIO,还有VNX- F(Rockies),IBM FlashSystem.全闪存真正为效率而生,重新定义存储速度.凭借极致性能,高可用性,为您极大提高企业级应用效率.提到闪存的优势,那么毋庸置疑的就是速度!而在速度优势背后,SSD则面临着价格.容量以及寿命等方面的限制. 当然随着技术的发展,成本的下降,SSD有可能会取代机械硬盘,成为下一代企业存储的主要介质.机械硬盘可能转变为磁带的角色. 但是,闪存速度的确就是现在存储系统的极限吗?现在有需要基于