【发布时间】:2019-12-23 17:11:34
【问题描述】:
我开始在 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);
这会产生错误。这是因为 largeSized 和 smallSized 位于地址 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;
}
}
但这一切的作用是,当作用域结束时,传入的指针会恢复到调用函数之前的状态。
【问题讨论】:
标签: c++ pointers segmentation-fault