gpt4 book ai didi

c++ - 指向删除并指向其他对象时,C++中的Seg Faulting Pointers

转载 作者:行者123 更新时间:2023-12-02 10:22:38 25 4
gpt4 key购买 nike

我开始在C++中使用指针,并且我觉得我必须缺少C和C++之间的关键元素。

我在类中有一个成员函数,该成员函数进行比较然后更改指针指向的内容:

void thisClass::largerSmallerSetter(int leftSize, int rightSize, matrix& leftMatrix, matrix& rightMatrix, matrix* largermatrix, matrix* smallerMatrix)
{
if(leftSize >= rightSize)
{
*largermatrix = leftMatrix;
*smallerMatrix = rightMatrix;
}
else
{
*largermatrix = rightMatrix;
*smallerMatrix = leftMatrix;
}
}

本来我的电话是:

matrix* largerSized = nullptr;
matrix* smallerSized = nullptr;

largerSmallerSetter(LeftMatrix.getNumPieces(), RightMatrix.getNumPieces(), leftMemory, rightMemory, largerSized, smallerSized);

这会产生一个错误。这是由于largestSized和smallerSized存在于地址0x0的事实。

因此,我以为我可以确保使用来初始化指针。

matrix* largerSized = new matrix();
matrix* smallerSized = new matrix();

但是,这个新矩阵完全没有用,所以我想摆脱实际的“新矩阵”,而只希望指针指向一个现有矩阵。因此,我添加了删除调用以删除对象。当我尝试将指针重新分配给其他对象时,出现段错误。

现在在C语言中,当我使用malloc创建一个指针时,便可以释放该指针。而且指针仍然存在,我可以指向其他地方。

有没有一种方法可以实现我想要的功能,而无需创建一堆只会在内存中闲逛而成为内存泄漏的对象?

我考虑过使用std::shared_ptr。但是,当我重新分配指针时,我担心当指针到达作用域的末端时,它将尝试删除指向的对象,该对象是在较高作用域中创建的,并且需要继续存在。因此,我不一定对智能指针感兴趣。

我尝试的另一件事是:

void thisClass::largerSmallerSetter(int leftSize, int rightSize, matrix& leftMatrix, matrix& rightMatrix, matrix* largermatrix, matrix* smallerMatrix)
{
if(leftSize >= rightSize)
{
largermatrix = &leftMatrix;
smallerMatrix = &rightMatrix;
}
else
{
largermatrix = &rightMatrix;
smallerMatrix = &leftMatrix;
}
}

但这只是作用域结束时,传入的指针返回到调用该函数之前的状态。

最佳答案

让我们看一下代码的功能。

*largermatrix = leftMatrix;

它取消引用 largermatrix(从而获得指针指向的内存),并尝试使用赋值运算符将其填充 leftMatrix的内容(如果对该运算符有自定义重载,则可以是自定义操作)。因此,如果 largermatrix没有指向任何内容,则将得到您描述的问题。

另一方面,
largermatrix = &leftMatrix;

这将分配 largermatrix指向 leftMatrix的位置,这是您想要的。但是,由于 largermatrix是局部变量,因此更改不会传播到调用方。因此, largermatrix应该是对指针的引用。
void thisClass::largerSmallerSetter(int leftSize, int rightSize, 
matrix& leftMatrix, matrix& rightMatrix,
matrix*& largermatrix, matrix*& smallerMatrix)

顺便说一句,优良作法是函数不会更改的其他by-reference参数是const引用,如下所示:
void thisClass::largerSmallerSetter(int leftSize, int rightSize, 
const matrix& leftMatrix, const matrix& rightMatrix,
matrix*& largermatrix, matrix*& smallerMatrix)

关于c++ - 指向删除并指向其他对象时,C++中的Seg Faulting Pointers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59459001/

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