gpt4 book ai didi

c++ - 如何正确管理内存(运行时)C++

转载 作者:太空宇宙 更新时间:2023-11-04 14:50:32 25 4
gpt4 key购买 nike

所以我有一个名为 MatrixMxN 的类,在构造函数中它有参数行、列。我正在尝试为具有维度行、列的二维数组分配内存,尽管我在执行此操作时遇到了问题。(我重写了括号运算符来为每个条目赋值)

{
MatrixMxN coord(4, 1);
coord(0, 0) = 1.0;
coord(0, 1) = 1.0;
coord(0, 2) = 1.0;
coord(0, 3) = 1.0;
}

我面临的问题似乎是在调用解构函数时收到错误:-

Windows 已在 MatrixTest.exe 中触发断点。这可能是由于堆损坏,这表明 MatrixTest.exe 或它加载的任何 DLL 中存在错误。

我的矩阵类的片段如下;

typedef float* floatPtr;
class MatrixMxN {
private:
float** entry;
int rows;
int cols;

public:
MatrixMxN(int r, int c) {
rows = r;
cols = c;

//Create a matrix
if(rows > 0 && cols > 0) {
//Declare an array of pointers
entry = new floatPtr[rows];

//Declare each array
for(int i=0; i<rows; i++) {
entry[i] = new float[cols];
}

this->empty();
}
}
~MatrixMxN() {
//Free memory
for(int i=0; i<rows; i++) {
delete[] entry[i];
}

//Free pointers array
delete[] entry;
}

void empty() {
for(int i=0; i<rows; i++) {
for(int j=0; j<cols; j++) {
entry[i][j] = 0;
}
}
}

// Assignment operator
void operator=(MatrixMxN& other) {
//Check they are the same size
assert(rows == other.rows && cols == other.cols);

//Copy
for(int i=0; i<rows; i++) {
for(int j=0; j<cols; j++) {
entry[i][j] = other(i, j);
}
}
}
float& operator()(const int irow, const int icol) {
//Check they are not out of bounds
assert ( (irow >= 0 && irow < rows) || (icol >= 0 && icol < cols) );

return entry[irow][icol];
}
...

引发错误的部分在循环内的解构器中;

    //Free memory
for(int i=0; i<rows; i++) {
delete[] entry[i];
}

dbgheap.c 文件在第一次尝试 delete[] entry[i] where i =0 时抛出错误。虽然在打印矩阵时它按预期工作正常但这里似乎有错误。希望我在这里提供了足够的信息,谢谢。

Edit1:包含赋值运算符重载Edit2:包含 () 重载

回答:问题是我是以转置方式而不是我如何输入值的。此处内存已损坏,感谢所有帮助。

最佳答案

您应该一步分配内存:分配一个 M*N float 数组,然后在每次访问时计算访问位置。您的重新分配同样简单:删除 [] 矩阵;

关于c++ - 如何正确管理内存(运行时)C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9872524/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com