簡體   English   中英

“新”運算符的不同行為-動態內存分配

[英]Different behaviours of “New” operator - Dynamic memory allocation

我在嵌入式設備中使用簡單的內存分配程序測試了一個示例try-catch塊,該設備僅運行具有定制的linux OS 32位Xscale Arm體系結構的64MB RAM。該設備上沒有內存。Im列出以下代碼。假定為program1。

#include "stdio.h"
#include "stdlib.h"
int main()
{
    int count;
    int *q[409600];
    printf("\nHeap Leak Starting at..");
    system("date");
    fflush(stdout);
    printf("\n, Count is located at ,%p,",&count);
    for(count=0;count<409600;count++)
    {
            printf("\nCount = ,%d,",count);
            int i=2;
            try
            {
                    fflush(stdout);
                    q[count] = new int[409600];
                    printf("New Success.Allocated %ld Bytes at %p.Difference = 0x%x,\n",(i*100000),q[count],(long)(&i) - (long)q[count]);
                    fflush(stdout);
            }
            catch(...)
            {
                            printf("\nException Caught...New Failed..No Memory Available.\n");
                            fflush(stdout);
                            exit(1);
            }
    }
}

程序1的輸出:

Thu Jul 31 20:38:00 UTC 2014
Heap Leak Starting at..,

Count is located at ,0xbffffc48,

Count = ,0,New Success.Allocated 200000 Bytes at 0x402c0008.Difference = 0x7fbafc3c,

Count = ,1,New Success.Allocated 200000 Bytes at 0x40451008.Difference = 0x7fa1ec3c,

Count = ,2,New Success.Allocated 200000 Bytes at 0x405e2008.Difference = 0x7f88dc3c,

Count = ,3,New Success.Allocated 200000 Bytes at 0x40773008.Difference = 0x7f6fcc3c,

........The count goes on........

Count = ,1954,New Success.Allocated 200000 Bytes at 0xbf854008.Difference = 0x61bc3c,

Count = ,1955,New Success.Allocated 200000 Bytes at 0xbf9e5008.Difference = 0x48ac3c,

Count = ,1956,New Success.Allocated 200000 Bytes at 0xbfb76008.Difference = 0x2f9c3c,

Count = ,1957,
Exception Caught...New Failed..No Memory Available.

現在,這是預期的行為。由於沒有內存,因此將引發異常。

然后我將“ q [count] = new int [409600]”行修改為“ q [count] = new int [100000]”。讓我們假設它為program2。我重新編譯了該程序並在同一設備上執行。

程序2的輸出:

Thu Jul 31 20:39:43 UTC 2014

Heap Leak Starting at..,

Count is located at ,0xbffffc48,

Count = ,0,New Success.Allocated 200000 Bytes at 0x402c0008.Difference = 0x7fbafc3c,

Count = ,1,New Success.Allocated 200000 Bytes at 0x40322008.Difference = 0x7fb4dc3c,

Count = ,2,New Success.Allocated 200000 Bytes at 0x40384008.Difference = 0x7faebc3c,

Count = ,3,New Success.Allocated 200000 Bytes at 0x403e6008.Difference = 0x7fa89c3c,

............The count goes on.............

Count = ,5215,New Success.Allocated 200000 Bytes at 0x87d00018.Difference = 0x3816fc2c,

Count = ,5216,New Success.Allocated 200000 Bytes at 0x87d61aa0.Difference = 0x3810e1a4,

Count = ,5217,New Success.Allocated 200000 Bytes at 0x87e00018.Difference = 0x3806fc2c,

Count = ,5218,New Success.Allocated 200000 Bytes at 0x87e61aa0.Difference = 0x3800e1a4,

Count = ,5219,New Success.Allocated 200000 Bytes at 0x87f00018.Difference = 0x37f6fc2c,

Count = ,5220,

至此,該進程將永遠掛在New運算符上。即使我在后台運行該進程,也無法訪問終端。

現在,我對注意到new這種不同行為感到困惑。請不要在異常拋出的情況下,im分配比掛起進程的情況(100000)大的大小(409600)。 有人可以幫助我闡明New這種不同行為嗎? 請分享您的想法和一些線索,因為我需要調試該突破才能調試同一設備中報告的驗證錯誤。

PS:忽略數字200000因為我打印錯誤。

printffflush例程可能正在嘗試分配內存。 它們也可能正在鎖定或正在進行其他一些導致死鎖的同步。 可能需要內存來分配異常對象(盡管希望任何自重的運行時都可以處理這種情況)。

大多數C庫調用在沒有內存的情況下的行為可能無法很好地指定(也許它們死鎖或陷入循環,或者它們留下了一些損壞的東西,以便當您的“捕獲”嘗試打印時,它會死鎖)。 大多數庫對於內存不足(或即使它們需要使用任何內存)時的行為沒有明確定義的語義。

附加一個調試器或獲取追溯信息,以查看您的進程在哪里掛起/等待。

另外,您可以通過使用不太可能在其實現中分配任何內存的API調用來檢驗我的假設:

  • exit有助於確定退出代碼的哪一部分(傳遞不同的數字)
  • write通常是無分配的(但是它很難傳遞運行時字符串)。 類似於: write(1, "I am here", strlen("I am here")); (直接寫調用后無需刷新。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM