首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C/C++ 創建兩千萬字符長度超大字符串的內存分配與實現方案

     編輯:程式設計綜合問答

需求分析

2000 萬字符 ≈ 20 MB(單字節編碼)或 40 MB(UTF-16),屬於大對象分配,需關注堆內存、碎片化與分配失敗處理。

C 語言方案

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

char *create_huge_string(size_t len) {
    char *str = (char *)malloc(len + 1); // +1 留終止符
    if (!str) {
        fprintf(stderr, "內存分配失敗:請求 %zu 字節\n", len + 1);
        return NULL;
    }
    memset(str, 'A', len); // 填充示例數據
    str[len] = '\0';
    return str;
}

int main() {
    const size_t LEN = 20000000;
    char *huge = create_huge_string(LEN);
    if (huge) {
        printf("分配成功,長度:%zu\n", strlen(huge));
        free(huge); // 必須釋放
    }
    return 0;
}

C++ 方案(推薦 std::string)

#include <string>
#include <iostream>
#include <new> // std::bad_alloc

std::string create_huge_string_cpp(size_t len) {
    try {
        std::string s(len, 'A'); // 一次性構造
        return s; // C++11 移動語義無拷貝開銷
    } catch (const std::bad_alloc&) {
        std::cerr << "內存不足\n";
        return {};
    }
}

關鍵注意事項

  • 32 位程序地址空間僅 2~3 GB,單次分配 20 MB 通常可行,但多次分配易碎片化導致失敗;優先編譯 64 位程序。
  • 避免棧上分配(如 `char buf[20000000]`),棧默認僅 1~8 MB,會棧溢出。
  • 大內存分配前可嘗試 malloc_trim(0)(glibc)或預留地址空間(Windows `VirtualAlloc`)。
  • 若需持久化或跨進程共享,考慮內存映射文件(mmap/CreateFileMapping)。

Java 對比

// Java 堆需設 -Xmx256m 以上
String huge = "A".repeat(20_000_000); // Java 11+

總結

C/C++ 用堆分配(malloc/new/std::string),務必檢查返回值/捕獲異常,用完釋放,64 位環境最穩健。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved