首页 > 解决方案 > 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;
}

标签: c++

解决方案


您的代码中有 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
} 

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


推荐阅读