deque等容器元素析构

本文通过一个示例揭示了在使用STL deque时,由于浅拷贝导致的析构错误,强调了自定义类时需完整定义拷贝构造函数、赋值运算符和析构函数的重要性,并提供了修复此问题的正确代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


我们在定义类时,常常会显得很随意,这样会出现很多意想不到的错误,如下面的例子:


/**                                                                                                              
 *                                                                                                               
 *                                                                                                               
 *                                                                                                               
 *                                                                                                               
 */                                                                                                              
                                                                                                                 
#include <stdio.h>                                                                                               
#include <iostream>                                                                                              
#include <deque>                                                                                                 
#include <string.h>                                                                                              
                                                                                                                 
class a                                                                                                          
{                                                                                                                
public:                                                                                                          
    a() : p(NULL)                                                                                                
    {                                                                                                            
        p = new char[20];                                                                                        
        char buf[] = "hello world!";                                                                             
        std::cout << buf << std::endl;                                                                           
    };                                                                                                           
                                                                                                                 
    ~a()                                                                                                         
    {                                                                                                            
        delete [] p;                                                                                             
        p = NULL;                                                                                                
    };                                                                                                           
private:                                                                                                         
    char* p;                                                                                                     
};                                                                                                               
                                                                                                                 
typedef std::deque<a> a_ptr_queue;                                                                               
a_ptr_queue g_queue;                                                                                             
                                                                                                                 
void func(const a& f)                                                                                            
{                                                                                                                
    g_queue.push_back(f);                                                                                        
}                                                                                                                
                                                                                                                 
int main()                                                                                                       
{                                                                                                                
    a test;                                                                                                      
    func(test);                                                                                                  
    return 0;                                                                                                    
}        

                                                                                                        
                                                                                                                 
                                                                                                                                                                                                                               


这个例子有什么问题?
deque在析构元素a的时候将会崩溃,因为其p并未初始化即进行delete操作,这里有一点需要注意的是
deque在push_back(f)的时候是会对f进行浅拷贝的,无论f是不是引用。
这个地方已经遇到很多次了,还是会忘记,这个例子的教训是:
一:自定义类的时候不要太随意,尽量定义完整,包括拷贝,拷贝构造,=操作符,析构;
二:在使用STL时,对一些用法要掌握的更牢固;


正确的写法如下:

 *                                               
 *                                               
 *                                               
 *                                               
 */                                              
                                                 
#include <stdio.h>                               
#include <iostream>                              
#include <deque>                                 
#include <string.h>                              
                                                 
class a                                          
{                                                
public:                                          
    a() : p(new char[20])                        
    {                                            
        char buf[] = "hello world!";             
        memcpy(p, buf, sizeof(buf));             
    };                                           
                                                 
    a(const a& n) : p(new char[20])              
    {                                            
        memcpy(p, n.get_p(), 20);                
    }                                            
                                                 
    char* get_p() const                          
    {                                            
        return p;                                
    }                                            
                                                 
    ~a()                                         
    {                                            
        delete [] p;                             
        p = NULL;                                
    };                                           
private:                                         
    char* p;                                     
};                                               
                                                 
typedef std::deque<a> a_ptr_queue;               
a_ptr_queue g_queue;                             
                                                 
void func(const a f)                             
{                                                
    g_queue.push_back(f);                        
}                                                
                                                 
int main()                                       
{                                                
    a test;                                      
    func(test);                                  
    return 0;                                    
}   


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值