离开范围后,类变量会自动删除,如何防止这种情况发生?

时间:2019-04-27 16:27:49

标签: c++ class object dynamic-memory-allocation calling-convention

从另一个类(B类)函数调用一个类(A类)函数时遇到问题,在该函数中,我试图调用的类(A类)中构造在该类中的变量在删除后被删除该函数完成并返回到我从(C类)中调用的函数。发生了什么,我该如何解决?

我曾尝试使用指向该类的指针并动态分配整个类,但变量仍被删除。


#include <iostream>
#include <vector>
#include <string>
#include <ctime>
using namespace std;

class A {

private:

    vector<string> vectorA;
    string stringA[5] = { "1", "2", "3", "4", "5" };
    string stringB[5] = { "6", "7", "8", "9" };

public:


    string generaterandnum() {
        int num1 = NULL;
        num1 = rand() % vectorA.size();
        string card = vectorA[num1];
        vectorA.erase(vectorA.begin() + num1);
        return card;
    }


    void buildvectorA()
    {
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                vectorA.push_back(stringA[j] + stringB[i]);
            }
        }
        return;
    }
};

class B {
private:
    vector<string>  vectorB;
    vector<string>  vectorC;

    A aobject;

public:

    void buildvectorBandC() {
        for (int i = 0; i < 5; i++) {
            vectorB.push_back(aobject.generaterandnum());
        }
        for (int i = 0; i < 5; i++) {
            vectorC.push_back(aobject.generaterandnum());
        }
    }

    void displayvector() {
        cout << "Vector: ";
        for (size_t i = 0; i < vectorB.size(); i++) {
            cout << "[" << vectorB[i] << "] (" << i << ") ";
        }
        cout << endl;
    }
};

    class C {
        friend int main();
        void programrun(int option) {
            A* a = new A;
            a->buildvectorA();
            B* b = new B;

            if (option == 0) {
                cout << "Here is the vector that just has been constructed" << endl;
                b->buildvectorBandC();
                while (true) {
                    b->displayvector();

                }
            }
        }
    };

    int main() {
        srand((unsigned int)time(NULL));
        cout << "Hello" << endl;
        cout << "Enter (R) to run the program." << endl;
        char input;
        while (true) {
            cin >> input;
            input = toupper(input);
            if (input == 'R') {
                C cobject;
                cobject.programrun(0);
                return false;
            }
            else {
                cout << "Invalid input" << endl;
            }
        }
    }

我期望用随机生成的数字构建矢量B和C,这些数字从vectorA中选取变量。但是我得到的是,当它生成generaterandnum()时,它显示一个错误,指出Project1.exe中0x00F1C77F的未处理异常:0xC0000094:整数除以零。因为vectorA的大小为0,因为在程序离开该类的作用域后已将其删除。

1 个答案:

答案 0 :(得分:1)

类成员的生存时间与您的类对象的生存时间相同。问题不在于对象的生存期,而在于B::aobject从未被调用过buildvectorA,因此vectorA是空的,因此vectorA.size() == 0是不存在的。然后,您尝试计算rand() % vectorA.size(),用0进行(整数)除是一个非常糟糕的主意。

您可能想为A创建一个构造函数,并在其中调用generaterandnum以确保它始终正确:

class A {

private:
    vector<string> vectorA;
    string stringA[5] = { "1", "2", "3", "4", "5" };
    string stringB[5] = { "6", "7", "8", "9" };

    void buildvectorA()
    {
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                vectorA.push_back(stringA[j] + stringB[i]);
            }
        }
    }

public:
    A() {
        buildvectorA();
    }

    string generaterandnum() {
        int num1 = NULL;
        num1 = rand() % vectorA.size();
        string card = vectorA[num1];
        vectorA.erase(vectorA.begin() + num1);
        return card;
    }
};

请注意,buildvectorA现在是私有方法。我们不希望任何人从外部调用它,因为他们不在乎随机数是如何生成的。他们只是想获得那些随机数。

这也意味着您的类C不需要调用buildvectorA,实际上,它甚至不需要任何对象A