比较复杂的一个程序,delete不知道怎么用,帮帮忙吧

alzhaom 2003-08-24 01:05:51
我要写一个程序,大概思想是有一个dialog, 里面有一个richedit2,每次从richedit里面读一行,判断其内容,进行一定的操作和存贮。
我定义了一个class CElementArray用来 存储一行里面所有的内容,每个内容都是keyword啊,变量啊什么的,都是一个CElement。(CElement里面没有指针)
class CElement : public CObject
{ private:
int length;
CString type;
CString content;

public:
CElement();
CElement(CString s);
virtual ~CElement();

CString getType();
CString getContents();
int getLength();
};
class CElementArray : public CObject
{
private:
CElement* elementArray[50];
int arrayLength;
public:
CElementArray();
CElementArray(CString oneLine);
virtual ~CElementArray();
void CInitElementArray(void);
void addElement(CElement* element);
CElement* getElement(int i);
int getArrayLength(void);
CMyDoc* m_Doc;
void init(CString oneLine);
};
CElementArray::CElementArray(CString oneLine)
{
.....
CInitElementArray();
CElement* newElement;
.....
}
在CElementArray(CString oneLine)里面,CInitElementArray();函数初始化elementArray[50],
void CElementArray::CInitElementArray(void)
{
CString init = "";
arrayLength=0;
for(int i=0; i<50; i++)
elementArray[i] = new CElement(init);

}
然后由于我判断读到一个element, 就 new一个newElement,然后存到elementArray里面,代码如下
CElement* newElement = new CElement(temp);
addElement(newElement);

我根本就不懂delete怎么用,所以析构函数什么也没写

在主函数里面,我有一个变量i来表明第几行,
for (i=0;i < nLineCount;i++)
{
nLineLength=0;
CString* strText=new CString("");
nLineLength = this->m_dialog->m_Edit.LineLength( m_dialog->m_Edit.LineIndex(i) );
this->m_dialog->m_Edit.GetLine(i, strText->GetBuffer(nLineLength+1), nLineLength+1);
strText->ReleaseBuffer(nLineLength);

CElementArray* m_elementArray = new CElementArray(*strText);
...... // 进行一些判断,然后会new 一些structure什么的把有用的信息存进去,读下一航的时候基本上上一行的m_elementArray就不用了,应该delete吗?我不知道要怎么搞,写了几行,但是运行时出错

由于程序很复杂,并不是每一个i++都是在这个for的开始处,可能中间有好多if,判断正确就i++,然后同样方法读新一行,这样就会new 新的m_elementArray 和strText,
build没有错误,但是运行几行后,出现一个错误窗口,debug assetion failed!
program:....
file:dbgheap.c
line:346
expression: _CrtCheckMemory()

然后就死掉了,时内存问题吗?m_elementArray 和strText都要delete吗?还有m_elementArray 里面的newelement,析构函数要怎么写
我刚学vc++2个月,被老板逼着编程序,但是什么都不太懂,那位高手帮帮忙吧


...全文
71 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengqinggao 2003-08-26
  • 打赏
  • 举报
回复
我也被你搞晕了,呵呵,实在不行,如果没有什么秘密的话,发到这个邮箱fqg76@163.com,我有时间帮你看看
fengqinggao 2003-08-26
  • 打赏
  • 举报
回复
呵呵,只要没有出差,一般都没有问题,:)
alzhaom 2003-08-26
  • 打赏
  • 举报
回复
我发现了一个定义的char* 的东西,我把它改成了char,好像目前没错误了,等有问题我再来问吧。我还不是很懂 这个delete怎么用,还有whoo (谁) 讲的ASSERT,没什么概念用这些东西!土啊!

to fengqinggao(风清高) : 如果我有什么问题发信给你,可不要不理我啊,我的信箱是sassyj8@hotmail.com , 我的名字是sassyj,谢谢先了!!!

谢谢帮忙的几位同志们,谢谢谢谢,大恩大德无以为报,……※)※%
我结贴了

whoo 2003-08-26
  • 打赏
  • 举报
回复
每一个new 当然要对应一个 delete, 需要考虑的只是什么时候delete。
whoo 2003-08-26
  • 打赏
  • 举报
回复
void CElementArray:: addElement(CElement* element)
{
elementArray[arrayLength] = element; //add the element
arrayLength++; // length will be add 1
}

没有边界检查,你的数组定义才50, 一旦arrayLength >=50. 再arrayLength++就越界了。至少要在函数的开始加一个
ASSERT(arrayLength < 50);
whoo 2003-08-25
  • 打赏
  • 举报
回复
错误现象多半是 数组越界。

数组的初始化有错误, 应该是初始化为空,而不是为指向空内容的指针。
for(int i=0; i<50; i++)
elementArray[i] = NULL;

你的数组一初始化就满了,我想后面在加点什么东东的话,越结实很轻松的:)

把你的 void addElement(CElement* element);代码贴出来,我估计就能看出问题了。

fengqinggao 2003-08-25
  • 打赏
  • 举报
回复
忘了说一点,前者是对象,后者是指针,指针需要自己销毁,用完了别忘了删除,直接:
delete elementArray就可以了,没有必要循环delete
fengqinggao 2003-08-25
  • 打赏
  • 举报
回复
没有很大的区别,只是前者可能使用更方便,例如插入数据时,如果是数组,就得自己循环移动,而CArray就不用,它会帮你解决。如果没有插入数据之类的操作,就没有很大的差别了
alzhaom 2003-08-25
  • 打赏
  • 举报
回复
如果我定义了一个CArray <CElement, CElement> elementArray;
然后elementArray.SetSize(50,-1);
那么这个用法和我定义了一个CElement* elementArray[50];
有什么区别啊,有什么好处啊
fengqinggao 2003-08-25
  • 打赏
  • 举报
回复
关于删除指针,还是那句话,在它失效的时候删除————是类的成员变量,就在类的析构函数中删除,如果是局部变量,就在局部删除
alzhaom 2003-08-25
  • 打赏
  • 举报
回复
程序中的class CElementArray 的功能是把读进来的一行代码经过一些读取和处理,转化成若干个element,然后存入elementArray里面,
然后在主函数中,我没读一行,就new 一个CElementArray, 处理一行代码,然后用elementArray里面存的数据进行分析

如果我用数组的话,是不是要把elementArray改成CArray<CElement,CElement> m_elementArray;,但是如何delete这个array呢,是直接delete m_elementArray,还是先要删除里面所有的东东,在构析函数里面写删除每一个element


alzhaom 2003-08-25
  • 打赏
  • 举报
回复
还有一个问题,就是每一个存到elementArray里面的newElement 都是new出来,那么是不是每一个都要要delete呢,是在构析函数里面写,还是在delete那个carray elementArray时直接就删掉了

我已经被这个delete搞晕了,每一个new的我都在想是不是要delete掉,但是每一个我都没想出来怎么delete
alzhaom 2003-08-25
  • 打赏
  • 举报
回复
void CElementArray:: addElement(CElement* element)
{
elementArray[arrayLength] = element; //add the element
arrayLength++; // length will be add 1
}

我在主函数里面分析读进来的数据,分析出来一个element就写
CElement* newElement = new CElement(temp);
addElement(newElement);


什么叫数组越界啊????

我按上面建议的改成CArray <CElement, CElement> elementArray;
然后同样的 写CElement* newElement = new CElement(temp);
elementArray.Add(newElement );
调试时他告诉我 :can not convert the 1 parameter from "CElement" to "CElement" ??????

还有一个问题,如果我写了这个CArray什么的东东,那么最后要怎么释放内存 我看见他的函数里面有 removeall, Free***的东东,还是delete,在构析函数里面写吗?
我现在打算 这个CElementArray的函数不变,除了把数组改成那个carray
在主函数中,CArray <CElementArray, CElementArray> MyDoc;
把所有的数据都先读出来存到那个MyDoc中,然后再进行数据分析,这个方法行的通吗?
  • 打赏
  • 举报
回复
一,数组使用心得

原型: template< class TYPE, class ARG_TYPE > class CArray : public Cobject

简单地说是你输入的时候用ARG_TYPE类,输出的时候用TYPE,自动实现转换.

具体实现可以看c:\program files\microsoft visual studio\vc98\mfc\include\afxtempl.h.

如:

#include "afxtempl.h"//那个类需要那些头文件可以查看msdn,在类总括的最后

CArray<int, char> Vars;

Vars.SetSize(3,1);

Vars.SetAt(0,'a');

int x= Vars.GetAt(0);

这种性质对于自定义类更有效,因为我可以通过重载”=”,来控制改化过程.

设置断点,我们会发现这个类有三个类成员:m_nSize,m_nMaxSize,m_nGrowBy,分别对应元素个数,已经开辟的空间,空间不足时,每次开辟的多少个元素的空间.

常见函数:

int GetSize( ) const得到m_nSize的值.

int GetUpperBound( ) const;数组的上界,m_nSize-1.

void SetSize( int nNewSize, int nGrowBy = -1 );三个类成员都会变,以前加的内容不一定丢失.

void FreeExtra( );整理多余的空间,使m_nMaxSize = m_nSize.

void RemoveAll( );删除全部元素.

TYPE GetAt( int nIndex ) const;得到第nIndex(从0开始)元素的值.

void SetAt( int nIndex, ARG_TYPE newElement ); nIndex不能越界.

const TYPE* GetData( ) const;将数据指针返回.

void SetAtGrow( int nIndex, ARG_TYPE newElement );和SetAt类似,如果过大,会开辟新空间.

int Add( ARG_TYPE newElement );加一个元素,m_nSize加一.

int Append( const CArray& src );//加上一个同类型的数组.

void InsertAt( int nIndex, ARG_TYPE newElement, int nCount = 1 );
void InsertAt( int nStartIndex, CArray* pNewArray );

TYPE& operator []( int nIndex );以c风格操作数组.

TYPE operator []( int nIndex ) const;

其它数组有:

CByteArray 支持字节数组.

CWordArray 支持字数组.

CDWordArray 支持双字节数组.

CObArray 支持COject类型指针数组.

CPtrArray 支持Void类型指针数组.

CUIntArray 支持无符号整形数组.

CStringArray 支持CString数组.

用法与上面基本一致.
楼主看看是不是有必要用系统自带的数组

  • 打赏
  • 举报
回复
elementArray[i] = new CElement(init);
在CElementArray的析构函数中删除

int n = getArrayLength(void);
for( int i = 0 ; i < n ; i++)
delete elementArray[i];


  • 打赏
  • 举报
回复
# include "afxtempl.h"
CArray<CElement,CElement> m_elementArray;
======================================
这样就定义了一个一维数组
每个元素都是CElement
fengqinggao 2003-08-24
  • 打赏
  • 举报
回复
CElementArray* m_elementArray = new CElementArray(*strText);
...... // 进行一些判断,然后会new 一些structure什么的把有用的信息存进去,读下一航的时候基本上上一行的m_elementArray就不用了,应该delete吗?我不知道要怎么搞,写了几行,但是运行时出错

===========================

1、“读下一航的时候基本上上一行的m_elementArray就不用了”————这里有问题,你的数据存储了没有?存储了的话,存到那里去了,如果这个m_elementArray变量没有用了的话,那么该行的数据也就没有了,除非你在该类中定义了全局变量保存了数据。

2、建议不要在CElementArray类的构造函数中添加数据,对该类定义一个函数(如AddData(CString str)之类的函数专门处理数据添加,这样你就不需要每个循环都 new 了,容易处理一些,而且要存储数据也方便。

3、建议对CString不要用指针,处理起来只会增加麻烦,用对象就可以了,如果要传递它的指针,用&str就可以。

4、不管你的程序多么复杂,对一个指针在超出他的作用范围之前 delete 就可以了,超出了它的作用范围,即使不删除也不能使用,也可以在它的作用范围之内而你认为没有用了的时候删除,记住,删除后不能使用。

其他,根据你现在的代码还判断不出来,呵呵,水平有限

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧