提问者:小点点

C++成员初始化


下面是我学习复制构造函数和赋值运算符概念的代码。 我指的是Bjarne Stroustrup C++11的书。 但是当Vector类对象超出范围时,我的程序会崩溃。 这是我写的代码。

#include <iostream>


class Vector {
    double* elements;
    size_t size;
    
public:
    Vector();
    Vector(const Vector& vec);
    Vector& operator=(const Vector& vec);
    
    ~Vector();
    
    void print() {
        for(size_t i = 0; i < size; ++i)
            std::cout << elements[i] << ", ";
            
        std::cout << "\b\b \b" << std::endl;
    }
};

Vector::Vector() {
    size = 10;
    elements = new double[size];
    
    for(size_t i = 0; i < size; ++i)
        elements[i] = i + 1;
}

Vector::~Vector() {
    if(elements != nullptr)
        delete[] elements;
}

Vector::Vector(const Vector& vec) : elements { new double[size] }, size { vec.size } {
    for(size_t i = 0; i < size; ++i)
        elements[i] = vec.elements[i];
}

Vector& Vector::operator=(const Vector& vec) {
    size = vec.size;
    if(elements != nullptr)
        delete[] elements;
        
    elements = new double[size];
    for(size_t i = 0; i < size; ++i)
        elements[i] = vec.elements[i];  
}

int32_t main(int32_t argc, char* argv[]) {
    Vector vec1;
    std::cout << "vec1 elements are: " << std::endl;
    vec1.print();
    
    Vector vec2 = vec1;
    std::cout << "vec2 elements are: " << std::endl;
    vec2.print();

    return EXIT_SUCCESS;
}

共1个答案

匿名用户

您的代码中有2个问题。 首先,在构造函数中,您正在使用当前的size成员分配内存。 由于它是未初始化的,因此调用了未定义的行为。 您应该使用vec.size来分配内存:

Vector::Vector(const Vector& vec) : elements { new double[vec.size] }, size { vec.size } {
                                                      //  ^^^   
  // ...
}

其次,您不是从operator=返回,这也会调用未定义的行为。

Vector& Vector::operator=(const Vector& vec) {
     // ... 
    return *this;  // you need to return
} 

如果您只是简单地打开所有可能的警告,编译器就会告诉您这些问题。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|成员|初始化)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?