操作员=用双指针超载用于分数数学
operator= overloading with double pointers for fraction math
最初,我的实验室通过了三个参数:addfractionJesser( *lfrac, *rfrac,** resfrac);但是我发现我无法通过三个论点。我必须将其更改为** resfrac = addfractionJesser( *lfrac, *rfrac);现在我遇到问题。我知道我的指针和双重指针不在某个地方的范围之外,但我无法发现哪里。调试器指向第二行的问题:
FractionJesseR& FractionJesseR::operator=(const FractionJesseR& arg) {
num = arg.num;
denom = arg.denom;
return *this;
}
命名为:
FractionJesseR& addMenu(FractionJesseR* lFrac, FractionJesseR* rFrac) {
int option;
FractionJesseR** resFrac = new FractionJesseR*();
......
case 2:
cout << "Calling add() --nn";
**resFrac = addFractionJesseR(*lFrac, *rFrac);
break;
......
** resfrac = addfractionJesser(*lfrac,*rfrac);最初是AddFractionJesser( *lfrac, *rfrac,** resfrac);
命名为:
void displayMenu() {
int option;
FractionJesseR *lFrac = nullptr;
FractionJesseR *rFrac = nullptr;
FractionJesseR *resFrac = nullptr;
......
case 2:
cout << " Adding Option --nn";
if (lFrac == nullptr && rFrac == nullptr) {
cout << " Not a proper call as no Fractions are available!nn";
}
else {
*resFrac = addMenu(lFrac, rFrac);
}
break;
*resfrac = addMenu(lfrac,rfrac)最初是AddMenu(lfrac,rfrac,&amp; resfrac)
(是的,我确实在所有指示器上都拨打了删除,我仍然是新手堆叠溢出并学会仅张贴相关代码的片段),我需要帮助将我指向正确的方向。我认为我的指针从AddMenu或DisplayMenu的某个地方出现了范围...也许我在删除了双重指针错误?
任何帮助将不胜感激!
编辑:
FractionJesseR& addFractionJesseR(FractionJesseR& lFrac, FractionJesseR& rFrac) {
int n = 0;
int d = 0;
FractionJesseR *resFrac = nullptr;
// Adding the fractions
n = (&lFrac)->getNum() * (&rFrac)->getDenom() + (&lFrac)->getDenom() *
(&rFrac)->getNum();
d = (&lFrac)->getDenom() * (&rFrac)->getDenom();
resFrac = new FractionJesseR(n / gcd(n, d), d / gcd(n, d));
if (d < 0) {
d = -d;
n = -n;
}
return *resFrac;
}
您在内存管理方面遇到问题。
我假设您正在使用某种版本的Visual Studio。调试器通常会标记要执行的下一行,因此您会在
上崩溃num = arg.num;
这是因为this
为null,因为
FractionJesseR** resFrac = new FractionJesseR*();
在免费商店(不寻常)上分配指针,并用0(由于括号)初始化它。这个:
**resFrac
首先放电resFrac
,给出一个空指针,然后您再次解除。删除无效指针是未定义的行为。在您的情况下,它会在第一个语句中导致分配运算符的崩溃。
明显的解决方案是停止使用指针和手动内存管理。充其量,使用对象:
FractionJesseR resFrac
// ...
resFrac = addFractionJesseR(*lFrac, *rFrac);
最坏的情况,使用智能指针:
auto resFrac = std::make_unique<FractionJesseR>();
// ...
*resFrac = addFractionJesseR(*lFrac, *rFrac);
您不想做的事情(除非您被迫这样做是因为这是一项任务,在这种情况下,我会质疑动机):
auto resFrac = new FractionJesseR;
// ...
*resFrac = addFractionJesseR(*lFrac, *rFrac);
// ...
delete resFrac;
addFractionJesseR()
正在返回对免费商店分配的值的引用。您要在哪里删除它?每个new
都必须与delete
匹配。
如果您真的想要一个手动内存管理的示例,则不应混合指针和参考:
FractionJesseR* addFractionJesseR(FractionJesseR* a, FractionJesseR* b)
{
auto n = a->getNum() * b->getDenom() + a->getDenom() * b->getNum();
auto d = a->getDenom() * b->getDenom();
if (d < 0)
{
d = -d;
n = -n;
}
return new FractionJesseR(n / gcd(n, d), d / gcd(n, d));
}
FractionJesseR* addMenu(FractionJesseR* a, FractionJesseR* b)
{
// ...
FractionJesseR* resFrac = addFractionJesseR(a, b);
// ...
return resFrac;
}
void displayMenu()
{
// ...
FractionJesseR *resFrac = addMenu(lFrac, rFrac);
// ...
delete resFrac;
}
请注意,在addFractionJesseR()
中分配的指针返回到addMenu()
,该指针将其返回到displayMenu()
,该指针将其删除。
- 用于查找数组中最大元素的出现次数的代码,给出分段错误
- C++ 函数,用于查找数组中四个最小最大元素的总和不起作用
- C++ 用于在数组中打印字符串的随机数
- 快速排序不适用于大型数组
- 用于获取数组长度的指针数学
- 在编译时自动生成用于稀疏数组索引的switch语句
- 为什么std::begin()和std::end()适用于固定数组,而不适用于动态数组
- 如何编写用于查找数组中一系列元素的函数?
- c++ 中用于扫描数组的指针
- const 数组,用于在数组长度定义中使用其元素或为模板参数提供值
- 我用于汇总数组元素的 c++ 代码无法正常工作
- 重载 std::begin() 和 std::end() 用于非数组
- 唯一/共享 ptr 用于在数组超出范围后自动删除阵列
- C 计数器用于从数组中选择事物
- 可用于键入数组别名
- C++ rand() 不适用于字符串数组
- 用于在数组中找到零并切换标志 更新另一个数组的循环的SSE优化
- 用于将数组内容复制到指针的 C++ 库
- C# * 和 & 操作器,用于指向数组
- C++:用于扩展数组的函数