构造函数问题<无法读取内存>
Constructor issue <Unable to read memory>
我必须创建一个类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个int
s(以及一个用于平衡的位)的节点带来相当大的开销。不过,我无法想象会担心这一点——早在你有足够的节点来提高内存使用率之前,你就已经有太多的节点要呈现了,甚至没有考虑向用户呈现。
@mathematician1975已经为主要问题提供了答案。SortMatrix()
中还有另一个错误:您只交换第一列的元素,因此排序后,(第二列的)计数将不再正确。你必须插入
temp=matrix[i][1];
matrix[i][1]=matrix[i+1][1];
matrix[i+1][1]=temp;
让它发挥作用。
- 我可以在没有任何锁的情况下从不同的线程读取内存缓冲区吗?
- SAP Netweaver.C++ 错误:无法读取内存
- c++ 结构指针在初始化为 NULL 时无法读取内存
- GDB Python模块读取内存内容
- 内存池和<无法读取内存>
- 读取内存值(实时)最佳实践
- C++无法读取内存地址
- 构造函数问题<无法读取内存>
- C 螺纹池具有共享仅读取内存
- C++ 读取内存地址/指针和偏移量
- C++字符串无法读取内存
- 调用函数时,c++无法使用自定义类读取内存
- 无法读取内存以删除对象数组
- ConstantStruct或ConstantArray读取内存内容
- 如何在可视C++中读取内存地址
- C++:从注入的DLL读取内存的好方法是什么?
- C++ 对象的实例无法读取内存
- <无法读取内存> c++
- 内核驱动程序读取内存未发送整个字符串
- 在C++中嵌入 Python 的错误:无法读取内存