Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 创建用户定义类的实例并打开文件后memset出现问题_C++_Pointers_Memset - Fatal编程技术网

C++ 创建用户定义类的实例并打开文件后memset出现问题

C++ 创建用户定义类的实例并打开文件后memset出现问题,c++,pointers,memset,C++,Pointers,Memset,我在memset上遇到了一个奇怪的问题,这与我之前创建的一个类和在构造函数中打开的一个文件有关。我使用的类通常读取一个数组并将其转换为另一个数组,但这并不重要。我的班级是: #include <vector> #include <algorithm> using namespace std; class PreProcess { public: PreProcess(char* fileName,char* outFileName); void SortedOr

我在memset上遇到了一个奇怪的问题,这与我之前创建的一个类和在构造函数中打开的一个文件有关。我使用的类通常读取一个数组并将其转换为另一个数组,但这并不重要。我的班级是:

#include <vector>
#include <algorithm>
using namespace std;
class PreProcess
{
 public:
  PreProcess(char* fileName,char* outFileName);
  void SortedOrder();
 private:
  vector< vector<double > > matrix;
  void SortRow(vector<double> &row);
  char* newFileName;
  vector< pair<double,int> > rowSorted;
};
我还读取了构造函数中的文件,但我发现如果我不读取矩阵并打开文件,问题仍然存在。基本上,我已经把范围缩小到如果我注释掉memset正常工作的那两行,否则就不行了

现在来看我遇到的问题:我为矩阵编写了自己的简单包装器类。它没有太多的功能,我只需要在我的项目的下一部分2D数组,让一个类处理一切对我来说更有意义

头文件:

#include <iostream>
using namespace std;
class Matrix{
 public:
  Matrix(int r,int c);
  int &operator()(int i,int j)
  {//I know I should check my bounds here
    return matrix[i*columns+j];
  }
  ~Matrix();
  const void Display();
 private:
  int *matrix;
  const int rows;
  const int columns;
};
当我在输入行未注释的情况下运行时,我得到:

0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 -1371727776 32698 -1 0 
0 0 0 0 6332656 0 -1 -1 0 0 
6332672 0 0 0 0 0 0 0 0 0 
0 0 0 0 -1371732704 32698 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
我真的不知道内存中发生了什么导致了这种情况,如果我将memset替换为:

for(int i=0;i<rows*columns;i++)
   *(matrix+i) &= 0x0;
对于(int i=0;i您可以像这样使用
memset()

memset(matrix,0,sizeof(matrix));

这里的
matrix
是一个指针,因此
sizeof(matrix)
给出了指针的大小,而不是数组的大小。要填充整个数组,请使用
columns*rows*sizeof(int)

-谢谢,这很明显。一个好的编译器还应该支持
matrix=new int[rows*columns]();
在析构函数中,您可能希望在delete之后添加[],否则它将泄漏内存,并确保实现或删除复制构造函数和赋值运算符以防止双重删除。或者(正如在涉及手动内存管理的任何问题中有人总是说的那样)使用
向量。
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 -1371727776 32698 -1 0 
0 0 0 0 6332656 0 -1 -1 0 0 
6332672 0 0 0 0 0 0 0 0 0 
0 0 0 0 -1371732704 32698 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
for(int i=0;i<rows*columns;i++)
   *(matrix+i) &= 0x0;
memset(matrix,0,sizeof(matrix));