64,654
社区成员
发帖
与我相关
我的任务
分享
class TestB;
typedef boost::shared_ptr<TestB> TestBPtr;
class TestA
{
public:
TestBPtr _b;
public:
void set(TestBPtr B);
void show();
};
typedef boost::shared_ptr<TestA> TestAPtr;
TestA.cpp
#include "TestA.h"
#include "TestB.h"
void TestA::set(TestBPtr B)
{
_b = B;
}
void TestA::show()
{
_b->show();
}
TestB.h
#include "TestA.h"
namespace logserver
{
class TestB
{
public:
TestAPtr _a;
void create_a()
{
TestAPtr p(new TestA());
_a = p;
}
TestAPtr get_a()
{
return _a;
}
void show()
{
cout<<"a 调用 b 的接口"<<endl;
}
};
typedef boost::shared_ptr<TestB> TestBPtr;
以下是使用
TestBPtr b(new TestB());
b->create_a();
b->get_a()->set(b);
b->get_a()->show();
是有内存泄漏的,已经测试过了
// TestA.h
#ifndef TESTA_H
#define TESTA_H
#include <memory>
#include <iostream>
struct TestB;
struct TestA
{
~TestA () { std::cout << "~TestA" << std::endl; }
std::weak_ptr<TestB> _b;
void set(std::weak_ptr<TestB> B);
void show();
};
typedef std::shared_ptr<TestA> TestAPtr;
#endif
// TestA.cpp
#include "TestA.h"
#include "TestB.h"
void TestA::set(std::weak_ptr<TestB> B)
{
_b = B;
}
void TestA::show()
{
_b.lock()->show();
}
// TestB.h
#ifndef TESTB_H
#define TESTB_H
#include "TestA.h"
#include <iostream>
struct TestB
{
TestAPtr _a;
~TestB () { std::cout << "~TestB" << std::endl; }
void create_a()
{
TestAPtr p(new TestA());
_a = p;
}
TestAPtr get_a()
{
return _a;
}
void show()
{
std::cout<<"a 调用 b 的接口"<<std::endl;
}
};
typedef std::shared_ptr<TestB> TestBPtr;
#endif
// main.cpp
#include "TestB.h"
int main ()
{
TestBPtr b(new TestB());
b->create_a();
b->get_a()->set(b);
b->get_a()->show();
}
[/quote]
经过测试,问题得到解决。十分感谢
// TestA.h
#ifndef TESTA_H
#define TESTA_H
#include <memory>
#include <iostream>
struct TestB;
struct TestA
{
~TestA () { std::cout << "~TestA" << std::endl; }
std::weak_ptr<TestB> _b;
void set(std::weak_ptr<TestB> B);
void show();
};
typedef std::shared_ptr<TestA> TestAPtr;
#endif
// TestA.cpp
#include "TestA.h"
#include "TestB.h"
void TestA::set(std::weak_ptr<TestB> B)
{
_b = B;
}
void TestA::show()
{
_b.lock()->show();
}
// TestB.h
#ifndef TESTB_H
#define TESTB_H
#include "TestA.h"
#include <iostream>
struct TestB
{
TestAPtr _a;
~TestB () { std::cout << "~TestB" << std::endl; }
void create_a()
{
TestAPtr p(new TestA());
_a = p;
}
TestAPtr get_a()
{
return _a;
}
void show()
{
std::cout<<"a 调用 b 的接口"<<std::endl;
}
};
typedef std::shared_ptr<TestB> TestBPtr;
#endif
// main.cpp
#include "TestB.h"
int main ()
{
TestBPtr b(new TestB());
b->create_a();
b->get_a()->set(b);
b->get_a()->show();
}
// 申明
class TestA;
typedef boost::shared<TestA> TestAPtr;