gpt4 book ai didi

c++ - 静态方法中的对象创建正在更改其他静态对象的私有(private)成员变量

转载 作者:行者123 更新时间:2023-11-30 05:39:35 29 4
gpt4 key购买 nike

举一个我遇到的问题的简单例子,考虑一个创建链接的类(比如在链中)。除根链接外,每个链接都有一个父链接。根链接的父链接为空。

#ifndef LINK_HPP
#define LINK_HPP

#include <memory>
#include <string>

//Link.hpp
class Link
{
public:
Link(const std::string &linkName, const Link *parentLink);
Link(const std::string &linkName);
const Link* getParentLink();
~Link();
static Link* createRootLink(const std::string &linkName);
static Link* getRootLink();

private:
std::string linkName;
const Link *parentLink;
};

#endif
#include "Link.hpp"

Link* Link::createRootLink(const std::string &linkName)
{
std::unique_ptr<Link> rootLink(new Link(linkName));
return rootLink.get();
}

Link::Link(const std::string &linkName)
{
this->linkName = linkName;
this->parentLink = nullptr;
}

Link::Link(const std::string &linkName, const Link* parentLink)
{
this->linkName = linkName;
this->parentLink = parentLink;
}

Link::~Link()
{

}

const Link* Link::getParentLink()
{
return this->parentLink;
}

在对我的代码进行单元测试时,我创建了一个辅助类,它定义了对测试有用的函数。在 HelperClass.hpp 中有一个静态方法可以创建指向链接的共享指针并返回原始指针。请记住,此辅助函数只是为了重现问题。我知道这个方法有点没用。

#include "Link.hpp"

class HelperClass
{
public:
static Link* createALink(const std::string &linkName, Link* parentLink)
{
std::shared_ptr<Link> link(new Link(linkName, parentLink));

return link.get();
}
};

好了,现在进行实际测试,找出问题所在。

#include "gtest/gtest.h"
#include "Link.hpp"
#include "HelperClass.hpp"

class ReferenceFrameTest : public ::testing::Test
{
protected:

virtual void SetUp()
{
}
virtual void TearDown()
{
}

Link* rootLink = Link::createRootLink("root");
// Why does this call right here change the parentLink of rootLink!!
Link* link1 = HelperClass::createALink("link1", rootLink);

private:

};

TEST_F(ReferenceFrameTest, testRootLinkHasNullParent)
{
// the parent link of rootLink should be nullptr or 0
// this currently outputs 0x264f960
std::cout << rootLink->getParentLink() << std::endl;

// This fails if I create the Link* from HelperClass.hpp
ASSERT_FALSE(rootLink->getParentLink());
}

HelperClass 中创建指向链接的指针的行为以某种方式改变了 rootLinkparentLink。请注意,如果我只是在堆栈上实例化一个新链接,则 rootLinkparentLink 将保持 nullptr 应有的状态。我在这里错过了什么?非常感谢您的帮助!

最佳答案

createRootLink 返回一个悬挂指针。

Link* Link::createRootLink(const std::string &linkName)
{
std::unique_ptr<Link> rootLink(new Link(linkName));
return rootLink.get();
}

unique_ptr 在超出范围时删除其对象,这是在 createRootLink 函数的末尾。这样内存就可以被重用,或者各种其他未定义的行为。

关于c++ - 静态方法中的对象创建正在更改其他静态对象的私有(private)成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32291552/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com