Vector 中的结构值在按值传递时损坏

Struct Values inside Vector Become Corrupted when Passed by Value

提问人:JShorthouse 提问时间:12/5/2019 最后编辑:JShorthouse 更新时间:12/6/2019 访问量:236

问:

我有以下简单的结构:

struct Wire {
    int start_x;
    int end_x;
    int start_y;
    int end_y;

    Wire(int sx, int ex, int sy, int ey): start_x(sx), end_x(ex), start_y(sy), end_y(ey) {}
};

我还有以下打印函数,可以从第一项中获取并打印出一些值:std::vector<Wire>

这些函数是相同的,除了一个按值取参数,另一个按引用取参数。

void print_first_wire_value(std::vector<Wire> wires){
    std::cout << "(" << wires[0].start_x << ", " << wires[0].start_y << ")" << std::endl;
}

void print_first_wire_reference(std::vector<Wire> &wires){
    std::cout << "(" << wires[0].start_x << ", " << wires[0].start_y << ")" << std::endl;
}

我的主函数包括以下代码。

它使用另一个函数用连线对象填充向量。然后,它调用这两个打印函数。

std::vector<Wire> wires = input_to_wires(first_line);

std::cout << "By value: " << std::endl;
print_first_wire_value(wires);
std::cout << "By reference: " << std::endl;
print_first_wire_reference(wires);

我知道第一个start_x和end_x值是 0 和 0。两个打印函数都应打印这些值。但奇怪的是,我反而得到了这个:

By value: 
(-543694264, -543694264)
By reference: 
(0, 0)

这到底是怎么回事?


最小可重现示例

(请原谅这些看似奇怪的名字,这是解决代码出现后编程挑战的开始)。

day3_lib.h

#pragma once
#include <vector>
#include <string>

struct Wire{
    Wire(int sx, int ex, int sy, int ey);
};

std::vector<Wire> populate_wires();

void print_first_wire_value(std::vector<Wire> wires);

void print_first_wire_reference(std::vector<Wire> &wires);

day3_lib.cpp

#include <vector>
#include <sstream>
#include <iostream>
#include <stdexcept>

struct Wire {
    int start_x;
    int end_x;
    int start_y;
    int end_y;

    Wire(int sx, int ex, int sy, int ey): start_x(sx), end_x(ex), start_y(sy), end_y(ey) {}
};

std::vector<Wire> populate_wires(){
    std::vector<Wire> wires;

    Wire wire1(0, 0, 1003, 0);
    Wire wire2(1003, 0, 1003, -138);
    Wire wire3(1003, 0, 662, -138);

    wires.push_back(wire1);
    wires.push_back(wire2);
    wires.push_back(wire3);

    return wires;
}

void print_first_wire_value(std::vector<Wire> wires){
    std::cout << "(" << wires[0].start_x << ", " << wires[0].start_y << ")" << std::endl;
}

void print_first_wire_reference(std::vector<Wire> &wires){
    std::cout << "(" << wires[0].start_x << ", " << wires[0].start_y << ")" << std::endl;
}

第3天.cpp

#include "./day3_lib.h"
#include <fstream>
#include <iostream>

int main(){
    std::vector<Wire> wires = populate_wires();

    std::cout << "By value: " << std::endl;
    print_first_wire_value(wires);
    std::cout << "By reference: " << std::endl;
    print_first_wire_reference(wires);
}
C++ 引用 按值传递

评论

3赞 463035818_is_not_an_ai 12/5/2019
请提供一个最小的可重复示例
1赞 Max Langhof 12/5/2019
看起来很像代码中的一些三规则违规,但未显示。我们需要一个最小的可重现示例来进一步帮助您。
1赞 Sam Varshavchik 12/5/2019
代码中的某个地方有一个 bug,而且这个 bug 可能在任何地方。这就是正在发生的事情。如果没有一个任何人都可以剪切/粘贴、运行和重现您的观察结果的最小可重现示例,那么在这里,任何人都无法为您提供太多帮助。
1赞 JShorthouse 12/5/2019
@SamVarshavchik 我已经更新了我的问题,以包含一个最小可重现的例子
1赞 Sam Varshavchik 12/5/2019
这是未定义的行为。所示代码在两个不同的地方使用两个完全不同的类,分别名为“Wire”。通过在没有任何类成员的标头中定义一个,然后在实际具有类成员的 different 中定义一个不同的类成员并填充它们,您期望完成什么?C++ 不以这种方式工作。在标头中定义一个类,并从所有源文件中定义该类。struct Wirestruct Wire.cppWire#include.cpp

答: 暂无答案