討論區快速選單
知識庫快速選單
虛擬社群公民行為研究 我的IT職涯該如何規劃 ?
[ 回上頁 ] [ 討論區發言規則 ]
請問一個開檔的問題?
更改我的閱讀文章字型大小
作者 : hero8822302(HERO8822302)
[ 貼文 14 | 人氣 1557 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/4/22 下午 11:32:40
各位高手,我有遇到一個問題
我用Debug模式做出來的執行檔開檔案一切正常,但是用Release Mode做出來的執行檔開啟相同的檔案的話,會出現
"0x004073a2"指令參考的"0x4cb51a80"記憶體。該記憶體不能為"read"。
不知道這是什麼原因??請高手指點一下迷津,感謝感謝。
作者 : ianchen0(too many errors)
[ 貼文 17 | 人氣 3 | 評價 90 | 評價/貼文 5.29 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/4/30 上午 07:29:14
1. 先將Optimization關掉.
2. rebuild 整個專案
3. 用debuger 去跑release mode
4. 應該會死在它要死的地方.
5. 檢查一下是不是"沒初死化便數"(初始化變數 :D)
作者 : hero8822302(HERO8822302)
[ 貼文 14 | 人氣 1557 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/4/30 下午 07:38:21
感謝您的幫忙
但我試了之後,發現是在delete出問題的
但是這個其他相同的陣列(不同名而以)delete就不會沒事

程式碼如下
     if(IsTetrahedral==true)
     {
     delete TetraElement;
     delete TetraNode;
     TetraElement=NULL;
     TetraNode=NULL;
     }
     if(IsBrick==true)
     {
     delete BrickElement;
     delete BrickNode;
     BrickElement=NULL;
     BrickNode=NULL;
     }
     if(IsBeam==true)
     {
     delete BeamElement;
     delete BeamNode;
     BeamElement=NULL;
     BeamNode=NULL;
     }
     if(m_tool!=NULL)
     {
     delete m_tool;
     m_tool=NULL;
     }
只要有delete BeamElement就會掛掉∼...好奇怪,這些陣列都是同一個階層開啟跟清除的阿?
不懂不懂不懂....
作者 : hero8822302(HERO8822302)
[ 貼文 14 | 人氣 1557 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/4/30 下午 08:13:19
而且再輸出視窗顯示的訊息是---可能是因為堆積損毀
真不知道這到底是哪有問題
作者 : hero8822302(HERO8822302)
[ 貼文 14 | 人氣 1557 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/4/30 下午 08:13:25
而且再輸出視窗顯示的訊息是---可能是因為堆積損毀
真不知道這到底是哪有問題
作者 : morphingman(morphingman)
[ 貼文 102 | 人氣 448 | 評價 150 | 評價/貼文 1.47 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/4/30 下午 10:12:49
delete 之前
dump TetraElement;
     TetraNode;
     BrickElement;
     BrickNode;
     BeamElement;
     BeamNode;
use
eg.

std::cout << TetraElement ;

可能指向相同region e.g TetraElement = [0x4f3000:0x4f3ffff] but BeamElement = [0x4f3400:0x4f4fff]
作者 : hero8822302(HERO8822302)
[ 貼文 14 | 人氣 1557 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/5/2 上午 08:24:27
morphingman大大感謝您的建議
但是小弟不知道怎麼使用Dump的功能...可以請您用一個簡單的小例子嗎
真的是十分的感謝您
作者 : morphingman(morphingman)
[ 貼文 102 | 人氣 448 | 評價 150 | 評價/貼文 1.47 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/5/2 上午 09:42:36
(1) debug mode 不開時

     if(IsTetrahedral==true)
     {
char dummy_wait;
std::cout << "TetraElement " << TetraElement << std::endl;
std::cin >> dummy_wait;
     delete TetraElement;
     delete TetraNode;
     TetraElement=NULL;
     TetraNode=NULL;
     }

一定要用std::endl 讓 std::cout flush掉印出後讓你看清再繼續
對其他pointer如是
optimization 要關掉 沒有console 的話也可用MsgBox()

其實在debug mode 設break point 應可看到這些pointer的值吧?
另這是memory管理嗎?還是某一個 class 的destructor?

作者 : hero8822302(HERO8822302)
[ 貼文 14 | 人氣 1557 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/5/2 下午 02:10:41
阿∼這個只是記憶體的管理,不是解構子
我有設過break point觀察delete前的記憶體內的值,值一切正常
但是只要delete後,就會發生記憶體堆崩壞!然後掛掉...我先試試看您建議的方式,謝謝您

作者 : morphingman(morphingman)
[ 貼文 102 | 人氣 448 | 評價 150 | 評價/貼文 1.47 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/5/2 下午 04:43:07
有可能delete 後又去access嗎?
檢查所有的access code

e.g.

a = *BeamElement;
if ( Obj->adr->uuu->one->two->three) do_something;

where
typeof (Obj->adr->uuu->one->two) == BeamNode

改成
BeamNode* y = Obj->adr->uuu->one->two;
if (y == NULL) std::cerr << "Oops\n"
else if (y->three) do_something;

覺得很多地方要改那麼OOP的長處來了
可以overload * 來檢查 省事
class BeamNode {
   BeamNode& operator * () {
     if (g != NULL) return *this;
     std::cout << "Oops\n";
   }
}
作者 : morphingman(morphingman)
[ 貼文 102 | 人氣 448 | 評價 150 | 評價/貼文 1.47 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/5/2 下午 05:11:20
也有可能是同一處delete 兩次或以上或大小不一致
有用placement new 嗎?
作者 : hero8822302(HERO8822302)
[ 貼文 14 | 人氣 1557 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/5/2 下午 05:58:36
這個向量是一個物件內的向量,
只有delete一次而已,因為我還保有這個物件的其餘部分成員函數。
程式碼大致如下。
class TECIO
{
public:
     double *BeamNode;
     int *BeamElement;
public:
     bool CreateContainer(int NodeMax,int ElementMax);
     void ReleaseContainer();
};

bool TECIO::CreateContainer()
{
     BeamNode=new double[NodeMax];
     for(int i=0;i<NodeMax;i++)BeamNode[i]=NULL;

     BeamElement=new int[ElementMax];
     for(int i=0;i<ElementMax;i++)BeamElement[i]=NULL;

     return true;
}

void TECIO::ReleaseContainer()
{
     if(BeamElement!=NULL)
     {
     delete BeamElement;
     BeamElement=NULL;
     }
     if(BeamNode!=NULL)
     {
     delete BeamNode;
     BeamNode=NULL;
     }
}
作者 : morphingman(morphingman)
[ 貼文 102 | 人氣 448 | 評價 150 | 評價/貼文 1.47 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/5/2 下午 06:10:56
bool TECIO::CreateContainer()
{
     BeamNode=new double[NodeMax];
     for(int i=0;i<NodeMax;i++)BeamNode[i]=NULL;

     BeamElement=new int[ElementMax];
     for(int i=0;i<ElementMax;i++)BeamElement[i]=NULL;

     return true;
}

BeamNode 是 double*, BeamNode[i] 是 double, double=NULL?

以C++ 應用
delete [] BeamNode; // ? delete BeamNode;
delete [] BeamElement; // ? delete BeamElement;

作者 : morphingman(morphingman)
[ 貼文 102 | 人氣 448 | 評價 150 | 評價/貼文 1.47 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/5/2 下午 06:15:29
for(int i=0;i<NodeMax;i++) ...
for (...)

是多餘的 compiler 應會初始化
new int, new double 的值
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++曠世奇才新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4725 | 人氣 9172 | 評價 31140 | 評價/貼文 6.59 | 送出評價 138 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/5/2 下午 08:53:08
>這個向量是一個物件內的向量,
>只有delete一次而已,因為我還保有這個物件的其餘部分成員函數。

有可能你在存取的時候溢出了配置的範圍;

或是不小心移動了 BeamNode 或 BeamElement 指標.


>程式碼大致如下。
>class TECIO
>{
>public:
> double *BeamNode;
> int *BeamElement;

我建議你用 std::vector 來做.

>public:
> bool CreateContainer(int NodeMax,int ElementMax);
> void ReleaseContainer();
>};
>
>bool TECIO::CreateContainer()
>{
> BeamNode=new double[NodeMax];
> for(int i=0;i<NodeMax;i++)BeamNode[i]=NULL;

這樣寫會比較清楚:
  BeamNode[i] = 0.0;

同時, 也建議你每一個句子一行, 並把 for-loop 的主體放在 {} 裡面:

  for (int i = 0; i < NodeMax; ++i)
  {
    BeamNode[i] = 0.0;
  }

>
> BeamElement=new int[ElementMax];
> for(int i=0;i<ElementMax;i++)BeamElement[i]=NULL;
>
> return true;
>}
>
>void TECIO::ReleaseContainer()
>{
> if(BeamElement!=NULL)

不用檢查指標是否 NULL, delete 0 是保證安全的.

> {
> delete BeamElement;

如 morphingman 所言, 正確的語法是:
  delete [] BeamElement;


> BeamElement=NULL;
> }
> if(BeamNode!=NULL)
> {
> delete BeamNode;
> BeamNode=NULL;
> }
>}
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++曠世奇才新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4725 | 人氣 9172 | 評價 31140 | 評價/貼文 6.59 | 送出評價 138 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/5/2 下午 09:25:19
>for(int i=0;i<NodeMax;i++) ...
>for (...)
>
>是多餘的 compiler 應會初始化
>new int, new double 的值

不會. 上面配置出來的記憶體是 default-initialize. 意即: 如果是個 class, 它會呼叫 class default constructor. 如果是內建類型, 它不會初始化.

如果 new 的不是個陣列, 可以加初始值:

  int *pi = new int(10);

如果 new 的是陣列, 沒有這樣的語法:

  int *pi = new int[n](10); // *** Error ***

作者 : morphingman(morphingman)
[ 貼文 102 | 人氣 448 | 評價 150 | 評價/貼文 1.47 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/5/2 下午 10:36:56
Sorry, I am wrong!

以上述的寫法,內建型別的確不會自動初始化

int* j = new int[5]; // j[0] = indetermined value

加了()就不用記是不是內建型別
int* i = new int[5](); // i[0] = 0, from (ISO C++ standard 8.5/5)

新時代語言應不要讓 programmer 記是不是內建型別
作者 : hero8822302(HERO8822302)
[ 貼文 14 | 人氣 1557 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/5/2 下午 11:16:42
感謝各位的幫忙,小弟會繼續依各位的建議將問題找出。
之所以會問這個問題是因為運行一且順利,我利用MFC設計一個介面播放動畫,
播放時完全順利,向前向後甚至任意位置都可以順利的播放,
也是過把讀入的檔案在寫出來檢查,也都沒有問題。
但唯獨播放使用BEAM陣列存取的內容時(播放完全正常,I/O也OK),在刪除向量時會掛掉
所以就想請教一下各位高手在記憶體管理方面的技巧和經驗
,畢竟我其餘的陣列(triangle...等)都是由BEAM寫好的程式碼在複製再修改成別的名稱的
基本上修改過的沒有問題,為什麼原來的就有問題我就真的找不出毛病。@@
不過還是謝謝各位。我在努力翻翻看
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++曠世奇才新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4725 | 人氣 9172 | 評價 31140 | 評價/貼文 6.59 | 送出評價 138 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/5/3 上午 12:07:21
>加了()就不用記是不是內建型別

內建型別跟 class 還是會有分別. 內建型別最終會 zero-initialized. Non-POD class 會呼叫其建構子, 如果建構子沒有作為, 成員不會初始化.

  struct NON_POD
  {
    NON_POD(void) {};
    int m_i;
  };

  struct POD
  {
    int m_i;
  };

  int *pi = new int[10](); // Built-in type: zero-initialized

  NON_POD *pc = new NON_POD[10](); // Non-POD class: default construction

  POD *pc2 = new POD[10](); // POD class: zero-initialized


>int* i = new int[5](); // i[0] = 0, from (ISO C++ standard 8.5/5)

You are right.

 板主 : 青衫 , Raymond
 > Visual C++ - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - Visual C++ - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
Visual C++
1 青衫 10990 
2 Raymond 9820 
3 Clier 7630 
4 小約翰 2500 
5 Cog 2030 
6 coco 1790 
7 aming 1410 
8 牧童哥 1400 
9 r2109 1380 
10 Akira 1350 
Visual C++
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2014 程式設計俱樂部 http://www.programmer-club.com.tw/
0.234375