程序停止-将数组移至函数| C ++

时间:2019-04-13 20:25:12

标签: c++ visual-studio c++11 c++14 c++17

我有2节课。 头等舱- Midgam -构造函数具有以下行:

midgam = new Vector[20];

第二个类- Vector -在这里创建一个名为array的数组。

程序运行良好,只是我有一个小问题。

在程序结束时,我尝试按字母顺序打印,我使用BubbleSort排序。排序工作正常,但是“交换”功能中的某些内容停止了。

外观如下:

void Midgam::Swap(Vector *xp, Vector *yp) {
    Vector temp = *xp;
    cout << temp.getName() << endl;
    *xp = *yp;
    *yp = temp;
}

void Midgam::bubbleSort() {
    int i, j;
    for (i = 0; i < iterator - 1; i++) {
        for (j = 0; j < iterator - i - 1; j++) {
            if (midgam[j].getName().compare(midgam[j+1].getName()) > 0) {
                Swap(&midgam[j], &midgam[j+1]);
            }
        }
    }
}

我使用Visual Studio,程序停止运行,并且程序在Vector类中向我显示了以下代码片段:

Vector::~Vector() {
if (array)
        delete[] array;
}

Midgam 的完整定义:

#include <iostream>
#include <string>
#include "Vector.h"

using namespace std;

#ifndef MIDGAM_H_
#define MIDGAM_H_

class Midgam {
private:
    int boxNum;
    int maxParties;
    int iterator;
    Vector *midgam;
public:
    Midgam(int num_of_boxes, int num_of_parties);
    virtual ~Midgam();
    void Start();
    void Menurmal();
    void SumOfEzor();
    double SumOfParty(string name);
    int SumAllVotes();
    void AddParty();
    void Swap(Vector *xp, Vector *yp);
    void bubbleSort();
    void Histograma();
    void PrintStars(int num);
    int FindPartyByName(string party);
    void PrintAll();
};

#endif /* MIDGAM_H_ */

向量的完整定义:

#include <iostream>
#include <string>
#include <sstream>

using namespace std;

#ifndef VECTOR_H_
#define VECTOR_H_

class Vector {
private:
    string name;
    int size;
    unsigned int *array;
    bool Bool;
public:
    Vector(string name, int size);
    Vector();
    Vector & operator=(const Vector &);
    virtual ~Vector();
    bool StringToArray(string str);
    bool getBool();
    string getName();
    unsigned int getAddress();
    int getSize();
    unsigned int getValueFromArray(int index);
    double sumOfArray();
    void PrintArray();
};

#endif /* VECTOR_H_ */

有人知道为什么它不起作用吗?谢谢

1 个答案:

答案 0 :(得分:0)

您的Vector缺少适当的副本构造函数。

Vector temp = *xp;
//NOT EQUAL TO:
//Vector temp;
//temp=*xp;

即使有等号,上述语句也不会调用operator=(const Vector &)。以下行是正确且等效的:

Vector temp(*xp);

原因是这是副本初始化-已创建temp,因此必须调用构造函数-尤其是副本构造函数Vector(const Vector &)。您没有明确声明,因此使用了默认值。

然后进行浅表复制,temp*xp共享相同的数组,并且当它们的两个析构函数都被调用时,第二个将尝试删除已删除的内存-触发Visual Studio的未定义行为调试器(至少在调试模式下)。

解决方案是进行适当的深层复制-创建一个新数组并复制其内容:

#include <algorithm> #Contains std::copy_n
Vector::Vector(const Vector& other)
{
    name=other.name;
    size=other.size;
    //Creates a new array
    array= new unsigned int[size];
    //Copies the array contents
    std::copy_n(other.array,size,array);
    Boo=other.Bool;
}

这也是为什么不使用原始内存的主要示例。我知道您正在实现自定义矢量,并且不想为std::vector使用array,但至少要使用std::unique_ptr。如果您只是这样做,那么您就不必首先提出这个问题,因为编译器会抱怨,调试器也不必完成编译器的工作。