类里面可以定义的成员变量数目难道受限制吗?怎么我现在在public里面定义什么变量都有问题啊?

解决方案 »

  1.   

    运行时点叉叉关闭就会出现debug assertion failed。
    还会出现unhandled exception in **.exe(KERNEL32.DLL):0xc0000005:access violation.
      

  2.   

    #if !defined(AFX_CLIENTDLG_H__BFDD7393_187F_451B_9FB9_1E1468421918__INCLUDED_)
    #define AFX_CLIENTDLG_H__BFDD7393_187F_451B_9FB9_1E1468421918__INCLUDED_#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    #include <afxwin.h>
    #include <afxcmn.h>
    #include <winsock2.h> 
    #include <Afxsock.h>
    #include <Mmsystem.h>
    #include "OScopeCtrl.h"
    #include "VideoCapture.h"
    #include "Encoder/libr263.h"
    #include "Decoder/tmndec.h"#define QCIF_WIDTH  176
    #define QCIF_HEIGHT 144#define IMAGE_WIDTH       QCIF_WIDTH
    #define IMAGE_HEIGHT      QCIF_HEIGHT#define InBlocks 4
    #define OutBlocks 4
    #define INPUT_BUFFER_SIZE 1000 /////////////////////////////////////////////////////////////////////////////
    // CClientDlg dialog#pragma comment(lib,"WS2_32.lib")
    struct CAdio{
    PBYTE lpData;
    DWORD dwDataLength;
    };
    class CClientDlg : public CDialog
    {
    // Construction
    public:
    // static UINT RecvWaveThread(LPVOID pParam);
    // static UINT SendWaveThread(LPVOID pParam);
    long OnVideoSocket(WPARAM wParam, LPARAM lParam);
    static UINT ConnectVideoProc (LPVOID lParam);
    void SendVideo(BYTE *data, int size);
    static UINT Sampling(LPVOID lParam);
    u_short GetPort(int pt);
    DWORD GetIP();
    static UINT ConnectDataProc (LPVOID lParam);
    CClientDlg(CWnd* pParent = NULL); // standard constructor
    COScopeCtrl m_forcechart;
    COScopeCtrl m_poschart;
    HANDLE m_hUSBDevice;
    SOCKET m_datasocket;
    SOCKET m_videosocket;
    PBITMAPINFO m_bmpinfo;
    CParam cparams;
    bool isVideo;
    int local_wnd_x , local_wnd_y;
    int remote_wnd_x , remote_wnd_y;
    HDC m_hdc;
    HWND hwnd;
    HDRAWDIB hdib;
    unsigned char vdata[30000];//存放视频数据
    unsigned int yuv[ QCIF_WIDTH*QCIF_HEIGHT  + (QCIF_WIDTH*QCIF_HEIGHT)/2 ];
    bool m_VideoSample;
    VideoCapture *vidcap;[color=#FF00FF][color=#FF00FF]/* int PORT2;
    HWAVEIN hWaveIn;  //输入设备
    HWAVEOUT hWaveOut; //输出设备 
    PWAVEHDR pWaveHdrIn;//音频头
    PWAVEHDR pWaveHdrOut; //输出音频头
    WAVEFORMATEX waveFormatOut,waveFormatIn;
    PBYTE pbBuffer1,pbBuffer2;//buffer指针
    //用于暂时存放要播放的音频和已经录音的音频队列
    CAdio InAdio[InBlocks],OutAdio[OutBlocks];
    int nAdioIn,nSend,//产生的音频和发送的音频指针
    nAdioOut,nRecv;//播放的音频和接收到的音频指针*/
    [/color]// Dialog Data
    //{{AFX_DATA(CClientDlg)
    enum { IDD = IDD_CLIENT_DIALOG };
    CIPAddressCtrl m_addr;
    CString m_dataport;
    CString m_videoport;
    CString m_localvideo;
    //}}AFX_DATA // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CClientDlg)
    protected:
    virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
    //}}AFX_VIRTUAL// Implementation
    protected:
    long OnDataSocket(WPARAM wParam,LPARAM lParam);
    HICON m_hIcon; CStatusBarCtrl m_bar;
    CWinThread* DThID;
    CWinThread* VThID;

    // Generated message map functions
    //{{AFX_MSG(CClientDlg)
    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    afx_msg void OnDatasampling();
    afx_msg void OnTimer(UINT nIDEvent);
    afx_msg void OnDatasend();
    afx_msg void OnVideosend();
    afx_msg void OnVideosampling();
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
    private: struct USBDATA{
    float force;
    float pos;
    };

    struct USBDATA1{
    char force[16];
    char pos[16];
    }; bool DataSample;};//{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_CLIENTDLG_H__BFDD7393_187F_451B_9FB9_1E1468421918__INCLUDED_)[/color]
    就是上面那个类啊。我在public里面加变量不可以加了。
      

  3.   

    unsigned char vdata[30000];//存放视频数据 //约30KB
    unsigned int yuv[ QCIF_WIDTH*QCIF_HEIGHT  + (QCIF_WIDTH*QCIF_HEIGHT)/2 ];  // 约152KB
    这2个数组太大了,占用了约180KB的内存,这个对象在栈里构造,可能会栈溢出。因为VC里的默认线程栈是1MB,定义几个这样的对象,就溢出了,Access violation.
    解决方法:2种,
    1.把大数组放在堆里,
    CClientDlg(CWnd* pParent = NULL)
    {
        vdata = new unsigned char[30000];
        yuv = new unsigned int [ QCIF_WIDTH*QCIF_HEIGHT  + (QCIF_WIDTH*QCIF_HEIGHT)/2 ]; 
        // 其他初始化
    }~CClientDlg()
    {
        delete []vdata;
        delete []yuv;
    }unsigned char *vdata;
    unsigned int *yuv;2. 把栈的提交内存调大些。项目-->属性-->配置属性-->链接器-->系统-->"堆栈保留大小"和“堆栈提交大小”改得大些
      

  4.   

    非常感谢!想再问一下,我很少自己写 delete []vdata;   delete []yuv; ,释放资源啊这些不是在关闭界面的时候自己会释放吗?有必要自己写出吗?
      

  5.   

    如果是自己NEW出来的资源~当然最好要自己 delete它们拉~
    其他的情况系统都会自动回收~除非你程序出错没有正常关闭,中途退出,以至程序没能及时回收资源咯