C++ Coder

HCP高性能计算架构,实现,编译器指令优化,算法优化, LLVM CLANG OpenCL CUDA OpenACC C++AMP OpenMP MPI

C++博客 首页 新随笔 联系 聚合 管理
  98 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks
http://blog.csdn.net/eclipser1987/article/details/8024555

为什么C++中不建议使用malloc calloc realloc等C语言函数?因为:这样分配的空间,返回的指针需要通过free来释放,但free释放空间不同于delete,free不会执行析构函数!

/* 
 * File:   main.cpp
 * Author: Vicky.H
 * Email:  eclipser@163.com
 
*/

#include 
<iostream>
#include 
<cstdlib>
#include 
<memory>

class A {
public:

    A() 
{
        std::cout 
<< "create A" << std::endl;
    }


    A(
const A& o) {
        std::cout 
<< "copy A" << std::endl;
    }


    
~A() {
        std::cout 
<< "delete A" << std::endl;
    }

}
;

/*
 * 
 
*/

int main(void{

    
char* buf1 = (char*) malloc(10); // 
    char* buf2 = (char*) calloc(110); // 效果虽然与上面一样,不同的是,calloc会将空间初始化为0.

    free(buf1);
    free(buf2);

    std::cout 
<< "---------------------------" << std::endl;

    
// 为什么C++中不建议使用malloc calloc realloc等C语言函数?因为:这样分配的空间,返回的指针需要通过free来释放,但free释放空间不同于delete,free不会执行析构函数!

    A
* ap = (A*) malloc(sizeof (class A) * 10);
    std::uninitialized_fill_n(ap, 
10, A());
    free(ap); 
// 调用1次create A ,1次delete A 10次copy A
    return 0;
}


 

---------------------------
create A
copy A
copy A
copy A
copy A
copy A
copy A
copy A
copy A
copy A
copy A
delete A

虽然实例程序,对空间的分配释放没有任何错误,但在某些情况,比如A类的析构伴随着某些特殊处理,将导致程序异常!

 

posted on 2012-10-19 22:57 jackdong 阅读(674) 评论(0)  编辑 收藏 引用 所属分类: C/C++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理