gpt4 book ai didi

c++ - 为什么 'new'类初始化失败

转载 作者:行者123 更新时间:2023-11-28 01:39:32 25 4
gpt4 key购买 nike

win7海湾合作委员会 6.4.0Cygwin 2.9.0

以下代码在类初始化期间在函数 g_block 中失败,但在 main 中使用时不会。当我尝试初始化代码时,失败出现在“for”循环中(这里初始化是一个附带问题)。在这两种情况下,分配似乎都是成功的,但是在类中使用时,我无法使用分配的内存。

# include <iostream>
# include <iomanip>

using namespace std;

typedef struct { // gsl allocation 'block' descritpoin
size_t size; // block bytes size
double* data; // pointer to the first byte of the block
} gsl_block;

typedef struct { // matrix definition
size_t size1; // number of rows
size_t size2; // number of columns
size_t tda; // number of elements in row (stride between rows)
double* data; // pointer to matrix[0][0]
gsl_block* block; // pointer to the gsl_matrix block
int owner; // 1: deallocation permitted
} gsl_matrix;

class X {
public:
inline static gsl_matrix& g_matrix(size_t row, size_t col)
{return g_matrix(row, col, g_block(row * col));};

static gsl_block& g_block(size_t size) {
double* ptr = new double(size);
cout << "size " << setw(5)<< size << " addr range "
<< hex << setfill('0') << ptr << " - " << (ptr + size*sizeof(double))
<< dec << setfill(' ') << endl;
for(size_t ndx = 0; ndx < size; ndx++) ptr[ndx] = 0.0;
return * new gsl_block{size, ptr};
};

static gsl_matrix& g_matrix(size_t row, size_t col, gsl_block& block) {
return * new gsl_matrix{row, col, col, block.data, &block, 0}; }

gsl_matrix& g_mat;
X() : g_mat(g_matrix(92, 92)) {}
}; // class X
int main(int argc, char** argv) {
gsl_matrix& mat = X::g_matrix(92, 92);
X* x = new X();
return 0;
}

最佳答案

double* ptr = new double(size);

这一行创建了一个 double值为 size在免费商店上,并返回指向它的指针。

for(size_t ndx = 0; ndx < size; ndx++) ptr[ndx] = 0.0;

此行然后通过尝试写入您的程序不拥有的内存来调用未定义的行为。

你真的应该使用 std::vector而不是原始指针。就您的程序而言,您很有可能会泄漏内存。如果你做了 gsl_block::data一个std::vector<double> ,您的类将免费获得适当的复制和移动语义,并且您不需要直接使用 new代码中的任何位置。

编辑:现在您已经提到您正在使用 GNU 科学库,您可能应该只使用该库提供的函数来分配和释放矩阵:gsl_matrix_allocgsl_matrix_free .我会重写你的 X类只包含一个 std::unique_ptrgsl_matrix_free作为它的删除者:

struct X
{
struct free_matrix
{
void operator()(gsl_matrix* mat)
{
gsl_matrix_free(mat);
}
};

std::unique_ptr<gsl_matrix, free_matrix> g_mat;

X(std::size_t rows, std::size_t cols)
: g_mat(gsl_matrix_alloc(rows, cols))
{}
};

你甚至可以走得更远,完全包装 gsl_matrix在更像 C++ 的接口(interface)中,具有调用 gsl_matrix_get 的成员函数/gsl_matrix_setgsl_matrix_pointer提供对矩阵元素的简单访问。

关于c++ - 为什么 'new'类初始化失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47822029/

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