标题:C ++運算符重載錯誤:使用動態數組時出現雙重釋放或損壞(fasttop)
只看楼主
adssc
Rank: 2
等 级:论坛游民
威 望:1
帖 子:61
专家分:32
注 册:2018-4-20
结帖率:100%
已结贴  问题点数:20 回复次数:6 
C ++運算符重載錯誤:使用動態數組時出現雙重釋放或損壞(fasttop)
我是c ++重載運算符的新手,所以可能會有很多語法錯誤。
不知道這是什麼問題,在函數聲明或實現中,該如何解決或提出寶貴意見?謝謝
下面的代碼給我一個錯誤:雙重釋放或損壞(fasttop):

輸入文件
程序代码:
6
*
2 2 3
2 3 3
+
2 -5 -5
2 10 10
-
3 9 9 9
3 1 1 1
*
2 2 3
2 3 3
L
2 3 4
N
2 3 4


main.cpp
程序代码:
#include <iostream>
#include <fstream>
#include "Vector.h"

using namespace std;
int main()
{

    ifstream inFile("input.txt");
    if (!inFile)
    {
        cout << "Read input.txt error" << endl;
        exit(1);
    }

    int testCase;
    inFile >> testCase;
    while (testCase > 0)
    {
        char op;
        inFile >> op;

        Vector v1, v2, v3;

        switch (op)
        {
            case '+':
                cout << "v1 + v2" << endl;
                inFile >> v1;
                inFile >> v2;
                cout << "v1:" << v1 << endl;
                cout << "v2:" << v2 << endl;
                v3 = v1 + v2;
                cout << v3 << endl;
                break;
            case '-':
                cout << "v1 - v2" << endl;
                inFile >> v1;
                inFile >> v2;
                cout << "v1:" << v1 << endl;
                cout << "v2:" << v2 << endl;
                v3 = v1 - v2;
                cout << v3 << endl;
                break;
            case '*':
                cout << "v1 * v2" << endl;
                inFile >> v1;
                inFile >> v2;
                cout << "v1:" << v1 << endl;
                cout << "v2:" << v2 << endl;
                cout << v1 * v2 << endl;
                break;
            case 'L':
                cout << "Length of v1" << endl;
                inFile >> v1;
                cout << "v1:" << v1 << endl;
                cout << v1.length() << endl;
                break;
            case 'N':
                cout << "Normalize of v1" << endl;
                inFile >> v1;
                cout << "v1:" << v1 << endl;
                cout << v1.normalize() << endl;
                break;
            default:
                break;
        }
        cout << endl;
        testCase--;
    }

    return 0;
}


vector.cpp
程序代码:
#include "Vector.h"
#include <string>
#include <math.h>

Vector::Vector()
{
    currentIndex;
    arrSize = 3;
    arr = new float[arrSize];
}

Vector::Vector(int size)
{
   arrSize = size;
   arr = new float[arrSize];
}


Vector::~Vector()
{
    delete [] arr;
}

void Vector::AddNumbertoArr(float number)
{
   for(int i = 0; i < arrSize; i++)
   {
       arr[i] = number;
   }
}

int Vector::getSize()
{
   return arrSize;
}

float Vector::length()
{
   float sum=0;
   for(int i = 0; i < arrSize; i++)
   {
       sum+=arr[i]*arr[i];
   }
   return sqrt(sum);
}

Vector Vector::normalize()
{
   float total = length();
   for(int i = 0; i < arrSize; i++)
   {
      arr[i] / total;
   }
   return Vector(3);
}


Vector & Vector::operator+(Vector v)
{
   if(arrSize == v.arrSize)
   {
       for(int i = 0; i < arrSize; i++)
       {
           arr[i] += v.arr[i];
       }
       return *this;
   }
   else
   {
       cout << "Error: size not match";
   }
}

Vector & Vector::operator=(Vector v)
{
   if(arrSize == v.arrSize)
   {
       for(int i = 0; i < arrSize; i++)
       {
           arr[i] = v.arr[i];
       }
       return *this;
   }
   else
   {
       cout << "Error: size not match";
   }
   
}

Vector & Vector::operator-(Vector v)
{
   if(arrSize == v.arrSize)
   {
       Vector currentIndex(arrSize);
       for(int i = 0; i < arrSize; i++)
       {
           arr[i] -= v.arr[i];
       }
       return *this;
   }
   else
   {
       cout << "Error: size not match";
   }
}


float & Vector::operator*(Vector v)
{
   float count;
   if(arrSize == v.arrSize)
   {
        for(int i = 0; i < arrSize; i++)
        {
            count += this->arr[i] * v.arr[i];
        }    
        return count;
   }
   else
   {
      cout << "Error: size not match";
   }
    
}

ifstream & operator>>(ifstream & in, Vector &v)
{
   for(int i = 0; i < v.arrSize; i++)
   {
       in >> v.arr[i];
   }
   return in;
}

ostream & operator<<(ostream & out, const Vector & v)
{
   for(int i = 0; i < v.arrSize; i++)
   {
       out << v.arr[i];
   }
   return out;
}


Vector.h
程序代码:
#pragma once
#include <iostream>
#include <fstream>

using namespace std;

class Vector
{
   private:
       float *arr;
       int currentIndex;
       int arrSize;
   public:
       //constructor
       Vector();
       Vector(int size);
       ~Vector();
      
       //setter
       void AddNumbertoArr(float number);

       //getter
       int getSize();

       float length();
       Vector normalize();

       //overload
       Vector &operator +(Vector v);
       Vector &operator =(Vector v);
       Vector &operator -(Vector v);

       //dot product
       float &operator *(Vector v);

       //input output overload
       friend ifstream& operator >> (ifstream& in, Vector &v);
       friend ostream& operator << (ostream& out, const Vector &v);
};


[此贴子已经被作者于2020-5-21 17:31编辑过]

搜索更多相关主题的帖子: operator float int cout Vector 
2020-05-21 17:24
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:7 
要实现什么功能? 题目贴一下
2020-05-21 18:27
adssc
Rank: 2
等 级:论坛游民
威 望:1
帖 子:61
专家分:32
注 册:2018-4-20
得分:0 
回复 2楼 rjsp
範例輸出
2020-05-21 21:14
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
坚决不肯给 题目要求,看来 题目要求 是机密呀,
如果你给出的“範例輸出”让我猜出了题目要求,那你这行为属于泄密;
如果你给出的“範例輸出”让我无法猜出题目要求,那我怎么知道你代码错在哪儿?
当然,你放心,除了神仙之外,没有人能根据“範例輸出”猜出题目要求。

下面的代碼給我一個錯誤:雙重釋放或損壞(fasttop):
唯一能给你的建议就是你某个类不能使用浅拷贝,你应该正确写出 拷贝构造、赋值、析构 三个成员函数。
2020-05-22 09:02
adssc
Rank: 2
等 级:论坛游民
威 望:1
帖 子:61
专家分:32
注 册:2018-4-20
得分:0 
回复 4楼 rjsp
不是不給題目,......, 而是根本沒題目, 只給範例輸出而已, 有題目早就給
2020-05-22 10:54
星星章、
Rank: 1
等 级:新手上路
帖 子:5
专家分:7
注 册:2020-5-21
得分:7 
Vector Vector::normalize()
{
   float total = length();
   for(int i = 0; i < arrSize; i++)
   {
      arr[i]/total;   //  arr[i]=  arr[i]/total;

float & Vector::operator*(Vector v)       float  Vector::operator*(Vector v)  返回的是 count  声明也要改


我运行之后不成功,但是我也很疑惑的是,,已经声明为友元函数了,但是还是会显示arrSize,arr是私有成员,不可访问。我也是新手,不太熟悉,我只能做到这里了。
2020-05-22 12:59
adssc
Rank: 2
等 级:论坛游民
威 望:1
帖 子:61
专家分:32
注 册:2018-4-20
得分:0 
回复 6楼 星星章、
謝謝你的嘗試,繼續努力中 哈哈
2020-05-22 20:21



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-501717-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 1.088515 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved