构造函数问题<无法读取内存>

Constructor issue <Unable to read memory>

本文关键字:读取 内存 gt lt 构造函数 问题      更新时间:2023-10-16

我必须创建一个类Histogram并对这个类进行操作。输入可以是一维数组或二维数组。当我把数组转换成矩阵时,问题就出现了。这就是我迄今为止所尝试的。错误为<Unable to read memory>

历史程序.h

#ifndef HISTOGRAM_H
#define HISTOGRAM_H
#include<iostream>
class Histogram
{
private:
int** matrix;
int lines;
void SortMatrix();
public:
Histogram(){ }
Histogram(int elements[], int elementsNr);
Histogram(int** m, int l);
void Print();
};
#endif

直方图.cpp

#include"histogram.h"
using namespace std;
Histogram::Histogram(int** m, int l)
{
matrix=m;
lines=l;
SortMatrix();
}
Histogram::Histogram(int elements[], int elementsNr)
{
lines=0;
//initialize matrix : elementrNr lines and 2 columns
int** matrix=new int*[elementsNr];
for(int i=0;i<elementsNr;i++)
{
matrix[i]=new int[2];
matrix[i][0]=INT_MIN;
matrix[i][1]=INT_MIN;
}
//search each element from the array in the matrix
bool found=false;
for(int i=0;i<elementsNr;i++)
{
found=false;
for(int j=0;j<elementsNr;j++)
{
//the element was found in the matrix ( on the first column )
if(matrix[j][0] == elements[i])
{
matrix[j][1]++;
found=true;
break;
}
}
if(!found)
{
matrix[lines][0]=elements[i];
matrix[lines][1]=1;
lines++;
}
}
SortMatrix();
}
void Histogram::SortMatrix()
{
bool flag=true;
int temp;
for(int i=0;(i<lines) && flag;i++)
{
flag=false;
if(matrix[i+1][0]>matrix[i][0])
{
temp=matrix[i][0];
matrix[i][0]=matrix[i+1][0];
matrix[i+1][0]=temp;
flag=true;
}
}
}
void Histogram::Print()
{
for(int i=0;i<lines;i++)
{
cout<<matrix[i][0]<<" : " <<matrix[i][1]<<endl;
}
}

main.cpp

#include"histogram.h"
#include<iostream>
using namespace std;
int main()
{
int arr[]={6,7,3,1,3,2,4,4,7,5,1,1,5,6,6,4,5};
Histogram h(arr,17);
h.Print();
}

此处为

int** matrix=new int*[elementsNr];

替换为

matrix=new int*[elementsNr];

因为CCD_ 2已经是成员变量。您正在创建一个名为matrix的新临时变量双指针,并为其分配内存,而不是成员变量matrix

一些人已经就如何修复此代码的一些问题向您提供了建议。我会给出稍微不同的建议,相比之下,这些建议最初可能看起来有点残酷,但我会努力证明它是如何真正有用而不是令人讨厌的。

我会抛出您现有的代码,但可能有main中的例外,然后使用std::map重新开始。您现在所做的基本上是尝试重新创建std::map已经提供的功能(即使您的代码是固定的,它也不能像std::map那样开箱即用地完成任务)。

使用map,你的整个程序会变成这样:

std::ostream &operator<<(std::ostream &os, std::pair<int, int> const &d) { 
return os << d.first << " : " << d.second;
}
int main() { 
std::map<int, int> h;
for (int i=0; i<17; i++)
++h[arr[i]];
std::copy(h.begin(), h.end(), 
std::ostream_iterator<std::pair<int, int> >(std::cout, "n"));
return 0;
}

如果您想维护与histogram类提供的接口几乎相同的接口,那么很容易做到这一点——for循环进入构造函数,copy进入print(SortMatrix消失,因为map总是排序的)。

通过这样做,您可以从O(N2)算法更改为O(N log N)算法。其他人指出的错误完全消失了,因为不再需要包含这些错误的代码。我能看到的唯一真正的缺点是,结果可能会使用更多的内存——它使用了一个具有单独分配的节点的平衡树,这可能会给只包含2个ints(以及一个用于平衡的位)的节点带来相当大的开销。不过,我无法想象会担心这一点——早在你有足够的节点来提高内存使用率之前,你就已经有太多的节点要呈现了,甚至没有考虑向用户呈现。

@mathematician1975已经为主要问题提供了答案。SortMatrix()中还有另一个错误:您只交换第一列的元素,因此排序后,(第二列的)计数将不再正确。你必须插入

temp=matrix[i][1];
matrix[i][1]=matrix[i+1][1];
matrix[i+1][1]=temp;

让它发挥作用。