1. 函数内或者类成员内存未释放
void MemoryLeakFunction()
{
XXX_Class * pObj = new XXX_Class();
pObj->DoSomething();
return;
}
复制
class MemoryLeakClass
{
public:
MemoryLeakClass()
{
m_pObj = new XXX_ResourceClass;
}
void DoSomething()
{
m_pObj->DoSomething();
}
~MemoryLeakClass()
{
;
}
private:
XXX_ResourceClass* m_pObj;
};
复制
void MemoryLeakFunction()
{
std::unique_ptr<XXX_Class> pObj = make_unique<XXX_Class>();
pObj->DoSomething();
return;
}
复制
2. delete []
调用了
operator new
从堆上申请所需的空间调用
XXX_Class
的构造函数
调用了
XXX_Class
的析构函数通过
operator delete
释放了内存
class MemoryLeakClass
{
public:
MemoryLeakClass()
{
m_pStr = new char[100];
}
void DoSomething()
{
strcpy_s(m_pStr, 100, "Hello Memory Leak!");
std::cout << m_pStr << std::endl;
}
~MemoryLeakClass()
{
delete m_pStr;
}
private:
char *m_pStr;
};
void MemoryLeakFunction()
{
const int iSize = 5;
MemoryLeakClass* pArrayObjs = new MemoryLeakClass [iSize];
for (int i = 0; i < iSize; i++)
{
(pArrayObjs+i)->DoSomething();
}
delete pArrayObjs;
}
复制
void MemoryLeakFunction()
{
const int iSize = 5;
std::unique_ptr<MemoryLeakClass[]> pArrayObjs = std::make_unique<MemoryLeakClass[]>(iSize);
for (int i = 0; i < iSize; i++)
{
(pArrayObjs.get()+i)->DoSomething();
}
}
复制
3. delete (void*)
InitObj
创建一个对象,并且返回一个PROGRAMER_HANDLE
(即void *
),对应用程序屏蔽其实际类型DoSomething
提供了一个功能去做一些事情,输入的参数,即为通过InitObj
申请的对象应用程序使用完毕后,一般需要释放SDK申请的对象,提供了
FreeObj
typedef void * PROGRAMER_HANDLE;
PROGRAMER_HANDLE InitObj()
{
MemoryLeakClass* pObj = new MemoryLeakClass();
return (PROGRAMER_HANDLE)pObj;
}
void DoSomething(PROGRAMER_HANDLE pHandle)
{
((MemoryLeakClass*)pHandle)->DoSomething();
}
void FreeObj(void *pObj)
{
delete pObj;
}
复制
void FreeObj(void *pObj)
{
delete ((MemoryLeakClass*)pObj);
}
复制
4. Virtual destructor
class Father
{
public:
virtual void DoSomething()
{
std::cout << "Father DoSomething()" << std::endl;
}
};
class Child : public Father
{
public:
Child()
{
std::cout << "Child()" << std::endl;
m_pStr = new char[100];
}
~Child()
{
std::cout << "~Child()" << std::endl;
delete[] m_pStr;
}
void DoSomething()
{
std::cout << "Child DoSomething()" << std::endl;
}
protected:
char* m_pStr;
};
void MemoryLeakVirualDestructor()
{
Father * pObj = new Child;
pObj->DoSomething();
delete pObj;
}
复制
class Father
{
public:
virtual void DoSomething()
{
std::cout << "Father DoSomething()" << std::endl;
}
virtual ~Father() { ; }
};
class Child : public Father
{
public:
Child()
{
std::cout << "Child()" << std::endl;
m_pStr = new char[100];
}
virtual ~Child()
{
std::cout << "~Child()" << std::endl;
delete[] m_pStr;
}
void DoSomething()
{
std::cout << "Child DoSomething()" << std::endl;
}
protected:
char* m_pStr;
};
复制
5. 对象循环引用
struct Node
{
Node(int iVal)
{
m_iVal = iVal;
}
~Node()
{
std::cout << "~Node(): " << "Node Value: " << m_iVal << std::endl;
}
void PrintNode()
{
std::cout << "Node Value: " << m_iVal << std::endl;
}
std::shared_ptr<Node> m_pPreNode;
std::shared_ptr<Node> m_pNextNode;
int m_iVal;
};
void MemoryLeakLoopReference()
{
std::shared_ptr<Node> pFirstNode = std::make_shared<Node>(100);
std::shared_ptr<Node> pSecondNode = std::make_shared<Node>(200);
pFirstNode->m_pNextNode = pSecondNode;
pSecondNode->m_pPreNode = pFirstNode;
//Iterate nodes
auto pNode = pFirstNode;
while (pNode)
{
pNode->PrintNode();
pNode = pNode->m_pNextNode;
}
}
复制
struct Node
{
Node(int iVal)
{
m_iVal = iVal;
}
~Node()
{
std::cout << "~Node(): " << "Node Value: " << m_iVal << std::endl;
}
void PrintNode()
{
std::cout << "Node Value: " << m_iVal << std::endl;
}
std::shared_ptr<Node> m_pPreNode;
std::weak_ptr<Node> m_pNextNode;
int m_iVal;
};
void MemoryLeakLoopRefference()
{
std::shared_ptr<Node> pFirstNode = std::make_shared<Node>(100);
std::shared_ptr<Node> pSecondNode = std::make_shared<Node>(200);
pFirstNode->m_pNextNode = pSecondNode;
pSecondNode->m_pPreNode = pFirstNode;
//Iterate nodes
auto pNode = pFirstNode;
while (pNode)
{
pNode->PrintNode();
pNode = pNode->m_pNextNode.lock();
}
}
复制
6. 资源泄露
void MemroyLeakFileHandle()
{
HANDLE hFile = CreateFile(LR"(C:\test\doc.txt)",
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (INVALID_HANDLE_VALUE == hFile)
{
std::cerr << "Open File error!" << std::endl;
return;
}
const int BUFFER_SIZE = 100;
char pDataBuffer[BUFFER_SIZE];
DWORD dwBufferSize;
if (ReadFile(hFile,
pDataBuffer,
BUFFER_SIZE,
&dwBufferSize,
NULL))
{
std::cout << dwBufferSize << std::endl;
}
}
复制
void MemroyLeakFileHandle()
{
HANDLE hFile = CreateFile(LR"(C:\test\doc.txt)",
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
std::unique_ptr< HANDLE, std::function<void(HANDLE*)>> phFile(
&hFile,
[](HANDLE* pHandle) {
if (nullptr != pHandle)
{
std::cout << "Close Handle" << std::endl;
CloseHandle(*pHandle);
}
});
if (INVALID_HANDLE_VALUE == *phFile)
{
std::cerr << "Open File error!" << std::endl;
return;
}
const int BUFFER_SIZE = 100;
char pDataBuffer[BUFFER_SIZE];
DWORD dwBufferSize;
if (ReadFile(*phFile,
pDataBuffer,
BUFFER_SIZE,
&dwBufferSize,
NULL))
{
std::cout << dwBufferSize << std::endl;
}
}
复制
7. 相关阅读
文章转载自一个程序员的修炼之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【专家观点】罗敏:从理论到真实SQL,感受DeepSeek如何做性能优化
墨天轮编辑部
1249次阅读
2025-03-06 16:45:38
【专家有话说第五期】在不同年龄段,DBA应该怎样规划自己的职业发展?
墨天轮编辑部
1236次阅读
2025-03-13 11:40:53
2025年2月国产数据库大事记
墨天轮编辑部
968次阅读
2025-03-05 12:27:34
2025年2月国产数据库中标情况一览:GoldenDB 3500+万!达梦近千万!
通讯员
857次阅读
2025-03-06 11:40:20
2月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
443次阅读
2025-03-13 14:38:19
AI的优化能力,取决于你问问题的能力!
潇湘秦
411次阅读
2025-03-11 11:18:22
优炫数据库成功应用于国家电投集团青海海南州新能源电厂!
优炫软件
337次阅读
2025-03-21 10:34:08
达梦数据与法本信息签署战略合作协议
达梦数据
282次阅读
2025-03-06 09:26:57
国产化+性能王炸!这套国产方案让 3.5T 数据 5 小时“无感搬家”
YMatrix
270次阅读
2025-03-13 09:51:26
磐维数据库对外门户全新升级!
磐维数据库
234次阅读
2025-03-04 15:32:59