diff --git a/Studio/Studio/MemoryAlignment.h b/Studio/Studio/MemoryAlignment.h index 30bb31b..e226361 100644 --- a/Studio/Studio/MemoryAlignment.h +++ b/Studio/Studio/MemoryAlignment.h @@ -1,7 +1,7 @@ -/******************************************************************* +/******************************************************************* * Copyright (c) 2022~2023 XMuli All rights reserved. * GitHub: https://github.com/XMuli - * Description: ֽڶж + * Description: 类中字节对齐判断 ******************************************************************/ // NOTE: diff --git a/Studio/Studio/SharedPtr.cpp b/Studio/Studio/SharedPtr.cpp index 721b8fa..d7bddfc 100644 --- a/Studio/Studio/SharedPtr.cpp +++ b/Studio/Studio/SharedPtr.cpp @@ -1 +1 @@ -#include "SharedPtr.h" +#include "SharedPtr.h" diff --git a/Studio/Studio/SharedPtr.h b/Studio/Studio/SharedPtr.h index bed332f..0fcba78 100644 --- a/Studio/Studio/SharedPtr.h +++ b/Studio/Studio/SharedPtr.h @@ -1,8 +1,8 @@ -/******************************************************************* +/******************************************************************* * Copyright (c) 2022~2023 XMuli All rights reserved. * GitHub: https://github.com/XMuli - * Description: C++ ʵһĵ shared_ptr ָģࣻʵṵ̈߳ȫģʹԴ̰߳ȫġ - * Note: дʱʹĬϹ캯, Ա _ptr_refCount_pMutex release() ױƼεĹ캯޴ + * Description: C++ 实现一个核心的 shared_ptr 智能指针模板类;实现了引用计数是线程安全的,但访问管理的资源不是线程安全的。 + * Note: 书写测试时,若使用默认构造函数, 成员变量 _ptr、_refCount、_pMutex 在 release() 中容易崩溃;推荐带参的构造函数,无错 * Ref: https://juejin.cn/post/7111726931301072910#heading-8 * https://cloud.tencent.com/developer/article/1688444 * https://blog.csdn.net/Z_Stand/article/details/98512756 @@ -20,7 +20,7 @@ public: SharedPtr() : _ptr(nullptr), _refCount(nullptr), _pMutex(nullptr) { cout << "default constructor" << endl; }; SharedPtr(T* obj) : _ptr(obj), _refCount(new int(1)), _pMutex(new mutex) { cout << "no default constructor" << endl; }; - SharedPtr(const SharedPtr& obj) // _refCount ͨһָ޸ģָͬһַ + SharedPtr(const SharedPtr& obj) // 其 _refCount 可以通过另外一个指针来修改,指向的是同一个地址 : _ptr(obj._ptr) , _refCount(obj._refCount) , _pMutex(obj._pMutex) @@ -34,13 +34,13 @@ public: cout << "copy assignment constructor" << endl; if (&obj != this) { if (_ptr != obj._ptr) { - release(); // ͷžɵԴ + release(); // 先释放旧的资源 _ptr = obj._ptr; _refCount = obj._refCount; _pMutex = obj._pMutex; - addRefCount(); // ټ +1 + addRefCount(); // 再技计数 +1 } } @@ -72,7 +72,7 @@ private: bool bDelMutex = false; _pMutex->lock(); - if (_ptr && --*_refCount == 0) { // УǷڣΪ 0 ͷ + if (_ptr && --*_refCount == 0) { // 先校验是否存在,及计数为 0 才释放 delete _ptr; delete _refCount; _ptr = nullptr; @@ -86,10 +86,10 @@ private: delete _pMutex; } -private: // ڹ캯гʼ - T* _ptr; - int* _refCount; - mutex* _pMutex; // ԭӲ߳ +private: // 需在构造函数中初始化 + T* _ptr; // 指向管理资源的指针 + int* _refCount; // 引用计数 + mutex* _pMutex; // 计数自增非原子操作,加锁解决多线程 }; //int main() @@ -97,12 +97,12 @@ private: // // SharedPtr sp1(new int(10)); // SharedPtr sp2(sp1); // *sp2 = 20; -// //sp1 sp2 ڹⲿԴüΪ 2 +// //sp1 与 sp2 在管理这部分资源,引用计数为 2 // cout << sp1.useCount() << " *ptr:" << *sp1 << endl; //2 20 // cout << sp2.useCount() << " *ptr:" << *sp2 << endl; //2 20 // // SharedPtr sp3(new int(30)); -// sp2 = sp3; //sp3 ֵͷŹľԴü-1 +// sp2 = sp3; //sp3 赋值给它,释放管理的旧资源,引用计数-1, // cout << sp1.useCount() << " *ptr:" << *sp1 << endl; //1 20 // cout << sp2.useCount() << " *ptr:" << *sp2 << endl; //2 30 // cout << sp3.useCount() << " *ptr:" << *sp3 << endl; //2 30 @@ -116,31 +116,30 @@ private: // // return 0; //} -/******************************************************************* - * ӡ: - * no default constructor - * copy constructor - * addRefCount - * 2 *ptr:20 - * 2 *ptr:20 - * no default constructor - * copy assignment constructor - * release - * addRefCount - * 1 *ptr:20 - * 2 *ptr:30 - * 2 *ptr:30 - * copy assignment constructor - * release - * addRefCount - * 3 *ptr:30 - * 3 *ptr:30 - * 3 *ptr:30 - * Hello World! - * destructor - * release - * destructor - * release - * destructor - * release +/*****************************打印结果******************************* +no default constructor +copy constructor +addRefCount +2 *ptr:20 +2 *ptr:20 +no default constructor +copy assignment constructor +release +addRefCount +1 *ptr:20 +2 *ptr:30 +2 *ptr:30 +copy assignment constructor +release +addRefCount +3 *ptr:30 +3 *ptr:30 +3 *ptr:30 +Hello World! +destructor +release +destructor +release +destructor +release ******************************************************************/ \ No newline at end of file diff --git a/Studio/Studio/SpecialMembers.cpp b/Studio/Studio/SpecialMembers.cpp new file mode 100644 index 0000000..69d9f04 --- /dev/null +++ b/Studio/Studio/SpecialMembers.cpp @@ -0,0 +1 @@ +#include "SpecialMembers.h" diff --git a/Studio/Studio/SpecialMembers.h b/Studio/Studio/SpecialMembers.h index 5adbafa..6bf8a2b 100644 --- a/Studio/Studio/SpecialMembers.h +++ b/Studio/Studio/SpecialMembers.h @@ -1,8 +1,8 @@ -/******************************************************************* +/******************************************************************* * Copyright (c) 2022~2023 XMuli All rights reserved. * GitHub: https://github.com/XMuli - * Description: C++ - * Refhttps://en.cppreference.com/w/cpp/language/rule_of_three https://en.wikipedia.org/wiki/Special_member_functions + * Description: C++ 类的特殊五个函数 + * Ref:https://en.cppreference.com/w/cpp/language/rule_of_three https://en.wikipedia.org/wiki/Special_member_functions ******************************************************************/ #pragma once @@ -51,7 +51,7 @@ public: return *this; } - A(A&& other) noexcept // в const + A(A&& other) noexcept // 行参无 const : m_ptr(nullptr) { std::cout << "move constructor" << endl; if (other.m_ptr) @@ -60,7 +60,7 @@ public: other.m_ptr = nullptr; } - A& operator=(A&& other) noexcept { // в const + A& operator=(A&& other) noexcept { // 行参无 const std::cout << "move assignment constructor" << endl; if (this != &other) { delete[] m_ptr; // Free the existing resource. @@ -89,20 +89,37 @@ A fn() { return t; } -//int main() -//{ -// A a1("a1"); // default constructor -// A a2(a1); // copy constructor -// A a3 = a1; // copy constructor -// a1 = a3; // copy assignment constructor -// -// std::cout << "----------------------------\n\n"; -// -// //fn(); // function returning a A object -// A a5 = std::move(a1); // move constructor -// A a6; // default constructor -// a6 = std::move(a1); // move assignment constructor -// std::cout << "Hello World!\n"; -// -// return 0; -//} +int main() +{ + A a1("a1"); // default constructor + A a2(a1); // copy constructor + A a3 = a1; // copy constructor + a1 = a3; // copy assignment constructor + std::cout << "----------------------------\n\n"; + + //fn(); // function returning a A object + A a5 = std::move(a1); // move constructor + A a6; // default constructor + a6 = std::move(a1); // move assignment constructor + std::cout << "Hello World!\n"; + + return 0; +} + +/*************************** 运行结果 ******************************* +* no-default-val constructor +copy constructor +copy constructor +copy assignment constructor +---------------------------- + +move constructor +default constructor +move assignment constructor +Hello World! +destructor +destructor +destructor +destructor +destructor + ******************************************************************/ diff --git a/Studio/Studio/Studio.cpp b/Studio/Studio/Studio.cpp index dd0513e..ab88913 100644 --- a/Studio/Studio/Studio.cpp +++ b/Studio/Studio/Studio.cpp @@ -1,4 +1,4 @@ -// Studio.cpp : This file contains the 'main' function. Program execution begins and ends there. +// Studio.cpp : This file contains the 'main' function. Program execution begins and ends there. // #include diff --git a/Studio/Studio/Studio.vcxproj b/Studio/Studio/Studio.vcxproj index cb3bc75..a566a5e 100644 --- a/Studio/Studio/Studio.vcxproj +++ b/Studio/Studio/Studio.vcxproj @@ -140,6 +140,7 @@ + diff --git a/Studio/Studio/Studio.vcxproj.filters b/Studio/Studio/Studio.vcxproj.filters index 1cdf398..5a978e3 100644 --- a/Studio/Studio/Studio.vcxproj.filters +++ b/Studio/Studio/Studio.vcxproj.filters @@ -24,19 +24,22 @@ Source Files + + Source Files + Header Files - - Header Files - Header Files Header Files + + Header Files + \ No newline at end of file diff --git a/Studio/Studio/UniquePtr.cpp b/Studio/Studio/UniquePtr.cpp index ee48038..9758177 100644 --- a/Studio/Studio/UniquePtr.cpp +++ b/Studio/Studio/UniquePtr.cpp @@ -1 +1 @@ -#include "UniquePtr.h" +#include "UniquePtr.h" diff --git a/Studio/Studio/UniquePtr.h b/Studio/Studio/UniquePtr.h index 277bb0c..9e2c298 100644 --- a/Studio/Studio/UniquePtr.h +++ b/Studio/Studio/UniquePtr.h @@ -1,7 +1,7 @@ -/******************************************************************* +/******************************************************************* * Copyright (c) 2022~2023 XMuli All rights reserved. * GitHub: https://github.com/XMuli - * Description: C++ ʵһĵ unique_ptr ָģࣻ + * Description: C++ 实现一个核心的 unique_ptr 智能指针模板类; * Ref: https://www.jianshu.com/p/77c2988be336 * https://juejin.cn/post/7122641980315680782 * https://juejin.cn/post/7099967913594978341 @@ -37,7 +37,7 @@ public: return *this; } - UniquePtr(const UniquePtr& obj) = delete; // C++11 delete ֹʽC++98 private + UniquePtr(const UniquePtr& obj) = delete; // C++11 delete 禁止方式,C++98 用 private 来隐藏 UniquePtr& operator=(const UniquePtr& obj) = delete; ~UniquePtr() @@ -78,15 +78,15 @@ private: //{ // UniquePtr up1(new int(10)); // cout << "up1:" << up1.get() << " *ptr:" << *up1 << endl; -// UniquePtr up2(std::move(up1)); // Ȩ -// cout << "up1:" << up1.get() << endl; // nullptr, ʱ up1 ޿Ȩ +// UniquePtr up2(std::move(up1)); // 控制权变更 +// cout << "up1:" << up1.get() << endl; // nullptr, 此时 up1 已无控制权 // cout << "up2:" << up2.get() << " *ptr:" << *up2 << endl; // // UniquePtr up3(new int(30)); // UniquePtr up4(new int(40)); // cout << "up3:" << up3.get() << " *ptr:" << *up3 << endl; // cout << "up4:" << up4.get() << " *ptr:" << *up4 << endl; -// up3 = std::move(up2); // Ȩ +// up3 = std::move(up2); // 控制权变更 // cout << "up3:" << up3.get() << " *ptr:" << *up3 << endl; // cout << "up4:" << up4.get() << " *ptr:" << *up4 << endl; // up3.swap(up4); @@ -101,7 +101,7 @@ private: //} /******************************************************************* - * ӡ: + * 打印结果: * no default constructor * up1:01355E78 *ptr:10 * move constructor