HEAP CORRUPTION

skt90 2008-02-29 11:28:30
为什么在执行delTree()最后释放tree时会出现heap corruption?
源程序:
tree.h
#ifndef TREE_H_
#define TREE_H_

/* Definition of ITEM */
typedef int ITEM;

/* Definition of node */
struct node {
node *left;
node *right;
ITEM item;
};

/* Definition of TREE */
typedef struct {
node *root;
unsigned int numberOfNode;
}*TREE;

/* Miscellaneous Method */
TREE initTree();
bool addElement(TREE tree,ITEM item);
void delElement(TREE tree,ITEM item);
void delTree(TREE tree);
static void delNode(node *node);
static void copyToNode(node *ptr,ITEM item);
static node * findPosition(TREE tree, //At here,the value 0 of direction presents left
ITEM item, //and the value 1 of direction presents right
node **prev, //prev is designed for further use.
bool &direction,
int (*compare)(ITEM item1,ITEM item2)); //Compare function is designed by user.

static int compare(ITEM item1,ITEM item2);
#endif


tree.cpp
#include <iostream>
#include "tree.h"
using namespace std;

TREE initTree()
{
TREE tree;
if(!(tree=(TREE)malloc(sizeof(TREE))))
return NULL;
tree->root=NULL;
tree->numberOfNode=0;
return tree;
}

bool addElement(TREE tree,ITEM item)
{
node *ptr;
if(!(ptr=(node *)malloc(sizeof(node))))
return false;
copyToNode(ptr,item);
ptr->left=ptr->right=NULL;
if(!tree->root)
tree->root=ptr;
else
{
bool direction=0;
node *prev=NULL;
if(findPosition(tree,item,&prev,direction,compare))
return false;
if(direction)
prev->right=ptr;
else
prev->left=ptr;
}
tree->numberOfNode++;
return true;
}

void delElement(TREE tree,ITEM item)
{
node *ptr=NULL,*prev=NULL;
bool direction=false;
if(ptr=findPosition(tree,item,&prev,direction,compare))
{
if(!ptr->left&&!ptr->right)
{
free(ptr);
if(direction)
prev->right=NULL;
else
prev->left=NULL;
}
else if(ptr->left&&!ptr->right)
{
if(direction)
prev->right=ptr->left;
else
prev->left=ptr->left;
free(ptr);
}
else if(!ptr->left&&ptr->right)
{
if(direction)
prev->right=ptr->right;
else
prev->left=ptr->left;
}
else
{
if(direction)
{
prev->right=ptr->left;
node *cur=ptr->left;
while(cur->right)
cur=cur->right;
cur->right=ptr->right;
free(ptr);
}
else
{
prev->left=ptr->left;
node *cur=ptr->left;
while(cur->right)
cur=cur->right;
cur->right=ptr->right;
free(ptr);
}
}
tree->numberOfNode--;
}
}

void delTree(TREE tree)
{
if(tree->root)
delNode(tree->root);
free(tree);
}

static void delNode(node *root)
{
if(root->left)
{
delNode(root->left);
root->left=NULL;
}
if(root->right)
{
delNode(root->right);
root->right=NULL;
}
free(root);
}

static void copyToNode(node *ptr,ITEM item)
{
ptr->item=item;
}

static node * findPosition(TREE tree,ITEM item,node **prev,bool &direction,int (*compare)(ITEM item1,ITEM item2))
{
node *cur=tree->root;
*prev=tree->root;
while(cur)
{
if(item==cur->item)
return cur;
else if(compare(item,cur->item)<0)
{
direction=false;
*prev=cur;
cur=cur->left;
}
else
{
direction=true;
*prev=cur;
cur=cur->right;
}
}
return NULL;
}

static int compare(ITEM item1,ITEM item2)
{
return item1-item2;
}
...全文
147 4 打赏 收藏 举报
写回复
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
skt90 2008-03-01
  • 打赏
  • 举报
回复
我是刚刚学完C,现在正在“升级”为C++,所以。。。。。
skt90 2008-03-01
  • 打赏
  • 举报
回复
果然如一楼所说,那要是按我原来的那样,是不是我的TREE结构里的成员已经溢出了?
arong1234 2008-02-29
  • 打赏
  • 举报
回复
我想,还是不要用这种面向过程的语言来做这种数据结构的事情,C++比它好多了
arong1234 2008-02-29
  • 打赏
  • 举报
回复


TREE initTree()
{
TREE tree;
tree你定义得是一个指针,分配时,你需要的尺寸是这个指针指向的结构的大小,而不是指针类型自己的大小,sizeof(TREE)永远是4,而你需要的是 *tree。
if(!(tree=(TREE)malloc(sizeof(TREE))))
return NULL;

改成tree = (TREE)malloc(sizeof(*tree)); //最好不要只定义指针类型,把结构类型也定义才是比较好的选择
tree->root=NULL;
tree->numberOfNode=0;
return tree;
}


相关推荐

Django框架概述

Django 是用 Python 开发的一个免费开源的 Web 框架,提供了许多网站后台开发经常用到的模块,使开发者能够专注于业务部分。并且囊括的 Web 应用部分可以用于快速搭建高性能、优雅的网站。并且提供了通用 Web 开发模式的高度抽象,

通过 DRY(Don't Repeat Yourself,不要重复自己)的理念为频繁进行的编程作业提供了快速解决方法。

Django的特点

1.自带管理后台 简单的几行代码就可以让目标网站拥有一个强大的管理后台,轻松对内容进行增加、删除、修改与查找操作,以及很方便地定制搜索、过滤等操作,因此特别适合用于内容管理平台。 在这里插入图片描述 在这里插入图片描述 2.灵活的路由系统 定义优雅的访问地址,还可伴随项目进行配置。 在这里插入图片描述

在这里插入图片描述

3.强大的数据库 ORM 强大的数据库操作接口(QuerySet API)可以轻松执行原生 SQL。 在这里插入图片描述 4.易用的模板系统 基于前后端分离系统可用 Django 开发 API,不使用模板系统,并也可以轻易替换成其他模板。在这里插入图片描述 5.缓存系统 与 Memcached,Redis 等缓存系统联合使用,获得更快的加载速度,并且配置简单。 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

6.国际化支持 支持多语言应用,允许定义翻译的文字,轻松翻译成不同国家/地区的语言。 在这里插入图片描述

Django 发布情况

功能版本(A.B,A.B+1,如 2.0,2.1 等)大约每 8 个月发布一次。这些版本将包含新功能以及对现有功能的改进等,也可能包含与上一个版本不兼容的功能,详细的说明在版本的发布日志(Release Notes)中可以查阅到。

补丁版本(A.B.C,如 2.1.3)会根据需要发布,以修复错误和安全问题。这些版本将与相关的功能版本 100% 兼容,除非是出于安全原因或为了防止数据丢失而无法做到 100% 兼容。

正因为如此,如果之前使用的是 Django 3.0,现在最新的版本是 Django 3.0.3,那么可以放心将 3.0 版本升级到 3.0.3版本。

某些功能版本被指定为长期支持(LTS)版本,这种稳定版本通常自发布之日起 3 年以内,会持续发布安全和关键补丁,即所谓提供持续稳定的支持。

从 Django 2.0 开始,它不再支持 Python 2。

下图演示了 Django 各版本的发布情况和支持计划 在这里插入图片描述

Django 的 MVT 架构简介

Django 是一个 Python Web 框架,和大多数框架一样支持 MVC模式。

通过学习 MVC(Model-View-Controller)模式,了解 Django MVT(Model-View-Template)的不同之处。

1.MVC 模式 MVC 是开发 Web 应用程序的一种软件设计模式,其中各部分功能如下: 模型(Model):位于模式底层,负责管理应用程序的数据。它处理来自视图的请求,并且响应来自控制器的指令以更新自身。 视图(View):负责向用户以特定格式呈现全部或部分数据。 控制器(Controller):控制模型和视图之间交互的代码。

MVT 模式 MVT 与 MVC 区别在于 Django 本身已经实现了控制器(Controller)这部分的功能,暴露给开发者的是模板(Template)。

所以可以简单认为 Django 中的模板是 HTML 文件,但其支持 Django 的模板语言。这种模板语言简单来说就是通过占位符、循环、逻辑判断等来控制页面上的内容展示。 在这里插入图片描述

Django 和其他 Python Web 框架的对比

用于 Python Web 开发的框架有很多,比如 Flask、Bottle、Pyramid、Webpy 等。

1. Django 和 Flask 的对比 在这里插入图片描述

Flask 是小而精的微框架(Micro Framework),它不像 Django 那样大而全。如果使用 Flask 开发,开发者需要自己决定使用哪个数据库 ORM、模板系统、用户认证系统等,需要自己去组装这些系统。

与 Django 开发相比,开发者在项目开始的时候可能需要花更多的时间去了解、挑选各个组件,正因为这样,Flask 开发的灵活度更高,开发者可以根据自己的需要去选择合适的插件。

由于是自己一步步地将整个系统组装起来的,因此也比较容易了解各个组件部分。当然,Flask 历史相对更短,第三方 App 自然没有 Django 那么全面。

2. Django 和 Tornado 的对比 在这里插入图片描述 Tornado 是一个 Python Web 框架和异步网络库,最初由 FriendFeed 开发,当初设计它的目的是为了解决 10000 个并发连接(C10K 问题)。

传统的 Apache 服务器会为每个 HTTP 请求连接一个线程,而在大多数 Linux 发行版中默认线程堆(Heap)大小是 8MB,当连接数量过多时,这种线程池的方式极易耗光服务器上的所有资源。Tornado 会把等待资源的操作挂起,当数据准备好时,再回调相应的函数。通过使用非阻塞网络 I/O,Tornado 可以轻松应对数万个连接。因而 Tornado 也就成为长轮询,是 WebSocket 和其他需要与每个用户建立长期连接的应用程序的理想选择。

和 Django 相比,使用 Tornado 编写异步代码对于开发者来说,没有 Django 或 Flask 编写同步代码那么简单、直接和高效。

使用 Python 进行 Web 开发合适吗?

Python 简单易学、上手快速,成为很多程序员喜爱的编程语言。使用 Python 进行 Web 应用开发,无疑能够加快需求实现的速度,快速迭代和验证产品的原型。有些人可能会有疑问:Python 性能不够好,用来开发 Web 是不是不太合适?

Python 在性能上确实无法和 C语言、Java 等语言相比,但在大部分情况下使用 Python 开发是可以满足性能需求的,并且很多时候程序性能不够好,这不是语言本身的问题,而是架构设计、缓存设计、数据结构算法的选用以及开发人员编程水平等引起的问题。

总之,使用 Python 语言进行 Web 开发有独特的优势,通常能满足大部分应用场景的需求。

 

发帖
C++ 语言

6.3w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2008-02-29 11:28
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下