标准字符串在类内部损坏

背风处

我正在尝试为某些构想的项目构建一个简单的节点图库,但是我很早就实现了我希望这是一个非常简单的障碍,但是我感到很困惑。

我定义了称为NodeDefinitions的对象,这些对象是可以在预定义的配置(端口/参数的数量等)中从中创建节点的配方。NodeDefinition对象包含定义每个输入/输出端口的PortDefinition对象。这些PortDefinition对象包含它们的名称(以及完整代码中的一些其他信息,尽管为了简洁起见在下面删除了这些信息)。

我的Node类具有一个Node()构造函数,该构造函数根据给定的NodeDefition对象创建一个Node。当我使用它时,我创建了每个Port对象,每个对象都包含一个指向其相应PortDefinition的指针。当我尝试打印出端口名称(源自/存储在PortDefinition对象中)时,它已损坏。

通过一些反复试验,我设法发现,如果我只是将std :: vector直接传递给备用Node()构造函数,那么一切似乎都可以正常工作。

在下面的示例代码中,我在构造函数内部然后在调用方之后输出端口名称(此处仅一个端口)。

定义类。

class PortDefinition
{
public:
    PortDefinition(const std::string & name) : m_name(name)
    {}
    std::string m_name;
};

class NodeDefinition
{
public:    
    NodeDefinition(std::vector<PortDefinition> portDefinitions) :
        m_portDefinitions(portDefinitions) 
    {}
    std::vector<PortDefinition> m_portDefinitions;
};

具体的对象类。

class Port
{
public:
    Port(PortDefinition * portDefinition) :
        m_portDefinition(portDefinition)
    {}
    const PortDefinition * m_portDefinition;
};

class Node
{
public:
    Node(NodeDefinition nodeDefinition) {
        std::vector<PortDefinition> portDefs = nodeDefinition.m_portDefinitions;
        for (auto & it : portDefs) {
            Port newPort = Port( &it );
            m_ports.push_back( newPort );
        }
        print();
    }

    Node(std::vector<PortDefinition> portDefs) {
        for (auto & it : portDefs) {
            Port newPort = Port( &it );
            m_ports.push_back( newPort );
        }
        print();
    }

    void print() const {
        std::cout << m_ports.size() << " : ";
        for (auto it : m_ports) {
            std::cout << "'" << it.m_portDefinition->m_name << "'" << std::endl; 
        }
    }
private:
    std::vector<Port> m_ports;
};

测试代码。

int main (int argc, const char *argv[])
{    
    std::vector<PortDefinition> portDefinitions;
    portDefinitions.push_back( PortDefinition("Port_A") );
    NodeDefinition nodeDefinition = NodeDefinition(portDefinitions);

    std::cout << "constuctor N1 : ";
    Node N1 = Node(nodeDefinition);
    std::cout << "main func N1  : ";
    N1.print();

    std::cout << std::endl;

    std::cout << "constuctor N2 : ";
    Node N2 = Node(portDefinitions);
    std::cout << "main func N2  : ";
    N2.print();
    return 1;
}

所有代码可以一起编译在一个文件中。

当我运行此命令时,将获得以下输出。

constuctor N1 : 1 : 'Port_A'
main func N1  : 1 : ''

constuctor N2 : 1 : 'Port_A'
main func N2  : 1 : 'Port_A'

如您所见,当我在使用使用NodeDefinition对象的Node()构造函数后打印出端口名称时,该名称为空,有时我会在那里乱扔垃圾,这使我认为某些东西在某种程度上破坏了内存,但我是为什么会迷失方向。

拉尔斯
        std::vector<PortDefinition> portDefs = nodeDefinition.m_portDefinitions;
    for (auto & it : portDefs) {
        Port newPort = Port( &it );
        m_ports.push_back( newPort );
    }

这段代码就是问题所在。portDefs是的副本nodeDefinition.m_portDefinitions,当构造函数完成后会被销毁。但是,您可以使用来存储指向这些对象的指针Port(&it)

print()构造函数应该做工精细,但print()在主现在访问摧毁副本,这是不确定的行为。

一种可能的解决方案是将shared_ptr您的PortDefinition存储或仅将副本存储在中Port

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章