回 帖 发 新 帖 刷新版面

主题:关闭对话框时出现“0x21016d9f指令引用的0xccccccc8内存,该内存不能为read”!

VC++中MFC建立的应用程序关闭对话框时出现“0x21016d9f指令引用的0xccccccc8内存,该内存不能为read”! 
请问高手这是怎么回事?是不是内存释放有问题,或者没有调用析构函数? 
部分代码如下: 
// bianxiaodlg.cpp : implementation file 
// 
#include "stdafx.h" 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 


#include "featuremodeling.h" 
#include "bianxiaodlg.h" 

#include <stdio.h> 
#include <math.h> 
#include <uf.h> 
#include <uf_defs.h> 
#include <uf_exit.h> 
#include <uf_ui.h> 
#include <uf_styler.h> 
#include <uf_mb.h> 
#include <uf_part_types.h> 
#include <uf_part.h> 
#include <uf_modl.h> 
#include <uf_obj.h> 
#include <uf_obj_types.h> 
#include <windows.h> 
#include <Winuser.h> 


///////////////////////////////////////////////////////////////////////////// 
// Cbianxiaodlg dialog 


Cbianxiaodlg::Cbianxiaodlg(CWnd* pParent /*=NULL*/) 
: CDialog(Cbianxiaodlg::IDD, pParent) 

//{{AFX_DATA_INIT(Cbianxiaodlg) 
//}}AFX_DATA_INIT 



void Cbianxiaodlg::DoDataExchange(CDataExchange* pDX) 

CDialog::DoDataExchange(pDX); 
//{{AFX_DATA_MAP(Cbianxiaodlg) 

//}}AFX_DATA_MAP 



BEGIN_MESSAGE_MAP(Cbianxiaodlg, CDialog) 
//{{AFX_MSG_MAP(Cbianxiaodlg) 
//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 


///////////////////////////////////////////////////////////////////////////// 
// Cbianxiaodlg message handlers 

BOOL Cbianxiaodlg::OnInitDialog() 

CDialog::OnInitDialog(); 

// TODO: Add extra initialization here 

UpdateData(TRUE); 

    PLD=(CEdit *)GetDlgItem(IDC_EDIT1); 
PLR=(CEdit *)GetDlgItem(IDC_EDIT3); 
PLn=(CEdit *)GetDlgItem(IDC_EDIT4); 
LR=(CEdit *)GetDlgItem(IDC_EDIT5); 
L2RT=(CEdit *)GetDlgItem(IDC_EDIT6); 
L2A=(CEdit *)GetDlgItem(IDC_EDIT7); 
L2B=(CEdit *)GetDlgItem(IDC_EDIT8); 


return TRUE;  // return TRUE unless you set the focus to a control 
              // EXCEPTION: OCX Property Pages should return FALSE 



void Cbianxiaodlg::OnOK() 

// TODO: Add extra validation here 



    CString D,R,n,RL,RT,A,B; 
    tag_t part,new_part2; 
tag_t m_part2=NULL_TAG; 
UF_PART_load_status_t error_status; 
int num_of_exp=0,i,ok; 
char partname[]="E:\\ug1\\WP7_1.prt"; 

    unsigned int aa=1; 
tag_t *exps=&aa,exp_tag; 
char *string,*lhs_str,*rhs_str; 


int type=1,unit=4; 
// char* title=null; 
int m_type2; 


double exp_value=50; 
char cc='q'; 
char *s=&cc; 

    char *p1="PL_D",*p2="PL_R",*p3="PL_n",*p4="L_R",*p5="L2_RT",*p6="L2_A",*p7="L2_B"; 

UF_UI_selection_options_t opts; 
    UF_UI_mask_t mask = {UF_solid_type, 0, UF_UI_SEL_FEATURE_BODY}; 


/* Make sure User Function is available. */  


    UF_initialize(); 

    if ( UF_initialize()!= 0) 
        // return ( UF_UI_CB_CONTINUE_DIALOG ); 

MessageBox("初始化失败"); 

    /* ---- Enter your callback code here ----- */ 

    opts.num_mask_triples = 5; 
    opts.mask_triples = &mask; 
    opts.scope = UF_UI_SEL_SCOPE_WORK_PART; 


PLD->GetWindowText(D); 
PLR->GetWindowText(R); 
PLn->GetWindowText(n); 
LR->GetWindowText(RL); 
L2RT->GetWindowText(RT); 
L2A->GetWindowText(A); 
L2B->GetWindowText(B); 


UF_PART_open(partname,&part,&error_status); 

part=UF_PART_ask_display_part(); 

/* fail=UF_MODL_ask_mass_props_3d(&part, 
                              num_part, 
                              type, 
                                      unit, 
                                      density, 
                                      accuracy, 
                                      acc_val, 
                                      massprop, 
                                      massprop_stat); 
*/ 
UF_MODL_ask_exps_of_part(part,&num_of_exp,&exps); 


for(i=0;i <num_of_exp;i++) 


UF_MODL_ask_exp_tag_string(exps[i],&string); 
UF_MODL_dissect_exp_string(string,&lhs_str,&rhs_str,&exp_tag); 
        UF_MODL_eval_exp(lhs_str,&exp_value); 


if(strcmp(lhs_str,p1)==0) 

s=lhs_str; 
strcat(s,"="); 
rhs_str=(char *)(LPCTSTR)D; 
strcat(s,rhs_str); 
UF_MODL_edit_exp(s); 

else if(strcmp(lhs_str,p2)==0) 

                        rhs_str=(char *)(LPCTSTR)R; 
    s=lhs_str; 
strcat(s,"="); 
strcat(s,rhs_str); 
UF_MODL_edit_exp(s); 

else if(strcmp(lhs_str,p3)==0) 
{   
                        rhs_str=(char *)(LPCTSTR)n; 
    s=lhs_str; 
strcat(s,"="); 
strcat(s,rhs_str); 
UF_MODL_edit_exp(s); 

else if(strcmp(lhs_str,p4)==0) 
{      
                        rhs_str=(char *)(LPCTSTR)RL; 
    s=lhs_str; 
strcat(s,"="); 
strcat(s,rhs_str); 
UF_MODL_edit_exp(s); 

else if(strcmp(lhs_str,p5)==0) 

                        rhs_str=(char *)(LPCTSTR)RT; 
    s=lhs_str; 
strcat(s,"="); 
strcat(s,rhs_str); 
UF_MODL_edit_exp(s); 

else if(strcmp(lhs_str,p6)==0) 

                        rhs_str=(char *)(LPCTSTR)A; 
    s=lhs_str; 
strcat(s,"="); 
strcat(s,rhs_str); 
UF_MODL_edit_exp(s); 

else if(strcmp(lhs_str,p7)==0) 

                        rhs_str=(char *)(LPCTSTR)B; 
    s=lhs_str; 
strcat(s,"="); 
strcat(s,rhs_str); 
UF_MODL_edit_exp(s); 





UF_MODL_update(); 
new_part2=UF_PART_ask_display_part(); 
//UF_PART_ask_families(part,&num_part,m_part); 
// UF_UI_select_with_class_dialog("Select solid bodies",title,&opts,&response, 
    //                              &num,&m_part); 
m_type2=UF_solid_type; 
UF_OBJ_cycle_objs_in_part( new_part2, m_type2, &m_part2 ); 


  
  UF_free(lhs_str); 
  UF_free(string); 
    UF_free(exps); 


  //UF_free(m_part); 


ok=UF_PART_save(); 

    UF_terminate (); 

CDialog::OnOK(); 


void Cbianxiaodlg::OnCancel() 

// TODO: Add extra cleanup here 

CDialog::OnCancel(); 
}

回复列表 (共3个回复)

沙发

出现这种问题,很有可能是因为你的数组越界了.

你代码太长,没时间细看,不好意思.

板凳

可能是你的编辑控件没释放内存

3 楼


指针的问题。。越权访问。。

此类错误调试方法一般采用2分法:

猜测大概是哪出错了。在那一段代码的中间设置断点,调试运行,

若到断点那还没出错,在在该段代码的开始和上一断点的中间设置代码,知道找出

出错位置。。

我来回复

您尚未登录,请登录后再回复。点此登录或注册