operator= 重载分数数学的双指针
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() --\n\n";
**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 --\n\n";
if (lFrac == nullptr && rFrac == nullptr) {
cout << " Not a proper call as no Fractions are available!\n\n";
}
else {
*resFrac = addMenu(lFrac, rFrac);
}
break;
*resFrac = addMenu(lFrac, rFrac) 最初是 addMenu(lFrac, rFrac, &resFrac)
(是的,我确实在我的所有指针上都调用了 delete,我对 Stack Overflow 还是个新手,并且学会了只放置相关的代码片段)我需要帮助指出正确的方向。我认为我的指针超出了 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
为空,因为
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()
,returns 返回到 displayMenu()
,displayMenu()
将其删除。
最初,我的实验室传递了三个参数: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() --\n\n";
**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 --\n\n";
if (lFrac == nullptr && rFrac == nullptr) {
cout << " Not a proper call as no Fractions are available!\n\n";
}
else {
*resFrac = addMenu(lFrac, rFrac);
}
break;
*resFrac = addMenu(lFrac, rFrac) 最初是 addMenu(lFrac, rFrac, &resFrac)
(是的,我确实在我的所有指针上都调用了 delete,我对 Stack Overflow 还是个新手,并且学会了只放置相关的代码片段)我需要帮助指出正确的方向。我认为我的指针超出了 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
为空,因为
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()
,returns 返回到 displayMenu()
,displayMenu()
将其删除。