【问题标题】:Using a variable in a for loop, causing segfault [duplicate]在for循环中使用变量,导致段错误[重复]
【发布时间】:2019-06-22 20:17:02
【问题描述】:

我正在练习运算符重载,我的目标是枚举我自己编写的向量类的所有值。

在执行此操作时,我遇到了一个段错误(没什么大不了的),并开始削减我的代码以查找它的起源。在经历了一些困难之后,我已经到了不明白出了什么问题的地步。

在尝试运行 for 循环来迭代向量对象中的数据时,我发现如果我使用设置为 10 的变量 s 会出现段错误。如果我使用整数文字 10,它有效。

这对我来说意义不大,但我又在处理不熟悉的概念。任何帮助表示赞赏!

这是一个 MCVE:

使用g++ Q1.cpp vector.h -o Q1编译

演示类(Q1.cpp):

#include <iostream>
#include "vector.h"

#define INFO(x) std::cout << "[INFO]: " << x << std::endl;

int main(void) {
    // 1- Test the default constructor
    INFO(" ---------- Vector 1 ----------");
    vector v1;
    INFO(v1);

   return 0;
}

矢量类(vector.h):

#include <iostream>
#include <string>

class vector {
public:
    float size;
    float* data;

    vector() : vector(0) {}

    vector(int s){
        size = s;
        data = new float[size]();
    }
};

std::ostream& operator<<(std::ostream& stream, const vector& obj){
    stream << "vector: size(" << obj.size << ")" << "\n";

    int s = 10;

    for(int i = 0; i < s; ++i){  // problem occurs here, replace s with '10' and it works.
        stream << i;
        //stream << "data[" << i << "] = " << obj.data[i]; 
    } 
}

【问题讨论】:

    标签: c++ operator-overloading


    【解决方案1】:

    你的重载函数需要返回stream

    另外,不要使用size_t 作为类成员名称。这完全令人困惑。

    vector 被删除时,您还应该删除data 数组。它现在泄漏了。

    【讨论】:

    • 谢谢,会的,我倾向于在知道我的代码有效后进行重构。是否有直观的原因不返回流会导致此错误?我的 IDE 甚至没有发现这个错误。
    • @HowardP 看到这个:stackoverflow.com/questions/1610030/…
    • @HowardP πάντα ῥεῖ 分享的链接解释了这一点。您的 IDE 可能有选项可以打开更多警告,这在这些情况下会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2020-04-05
    • 2016-06-18
    • 2013-06-05
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 2018-04-02
    相关资源
    最近更新 更多