我現在很困惑。我看到過類似的問題,我的實作似乎與這些解決方案一致,但我就是無法讓它發揮作用。
我需要一個UtilClass可以初始化和轉儲多維動態陣列的東西。我只想將指標傳遞給BaseClass 我想要初始化的陣列以及暗淡。我選擇使用new關鍵字而不是malloc(),但我擔心指標的范圍僅限于init函式而不是BaseClass(或陣列指標)的生命周期,這就是dump函式產生 SEGFAULT 的原因。
這里有一些代碼來解釋:
// BaseClass.h
#pragma once
include "UtilClass.h"
class BaseClass
{
public:
UtilClass* util{nullptr};
double** array{nullptr};
};
// BaseClass.cpp
#include "BaseClass.h"
BaseClass::BaseClass() {
util = new UtilClass();
util->init(array, 4, 6);
util->dump(array, 4, 6);
}
// UtilClass.h
#pragma once
class UtilClass {
void init(double** array, int rows, int cols);
void dump(double** array, int rows, int cols);
};
// UtilClass.cpp
#include "UtilClass.h"
void UtilClass::init(double **darray, int rows, int cols) {
int i,j;
array = new double*[rows];
for (i = 0; i < rows; i )
array[i] = new double[cols];
for (i = 0; s < rows; i )
for (j = 0; a < cols; j ) {
data[i][j] = 1;
std::cout << "Data in array " << data[i][j] << std::endl; // This obviously works
}
}
void dump(double** array, int rows, int cols) {
int i, j;
for (i = 0; i < rows; i )
for (j = 0; j < cols; j )
std::cout << array[i][j] << " "; // But this produces a SEGFAULT
std::cout << std::endl;
}
uj5u.com熱心網友回復:
讓我從一條建議開始:最好重用現有工具。考慮使用std::vector動態分配的陣列。這是經過良好測驗、優化且易于使用的。否則,您將需要處理記憶體管理的難題(例如,取消分配 dtor 中分??配的記憶體塊BaseClass)。
關于您的問題:當您呼叫時init,您按值傳遞指標。這意味著該init方法分配了一些記憶體并將指向它的指標存盤在其本地副本中darray。最后,init這個區域變數消失了(你失去了對它的訪問權限,泄漏了整個分配的記憶體)。將方法更改為:
void UtilClass::init(double ***array, int rows, int cols) {
int i,j;
*array = new double*[rows];
for (i = 0; i < rows; i )
(*array)[i] = new double[cols];
for (i = 0; i < rows; i )
for (j = 0; j < cols; j ) {
(*array)[i][j] = i*j;
std::cout << "Data in array " << (*array)[i][j] << std::endl; // This obviously works
}
}
呼叫轉儲時,需要傳遞 4 和 6(而不是 5 和 6)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/493273.html
