

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 中的記憶體管理 適用於 C\$1\$1 的 AWS SDK
<a name="memory-management"></a>

 適用於 C\$1\$1 的 AWS SDK 提供一種方法來控制程式庫中的記憶體配置和解除配置。

**注意**  
只有在您使用使用定義的編譯時間常數 建置的程式庫版本時，才能使用自訂記憶體管理`USE_AWS_MEMORY_MANAGEMENT`。  
如果您使用在沒有編譯時間常數的情況下建置的程式庫版本，例如 的全域記憶體系統函數`InitializeAWSMemorySystem`將無法運作；而是使用全域 `new`和 `delete`函數。

如需編譯時間常數的詳細資訊，請參閱 [STL 和 AWS 字串和向量](#stl-and-aws-strings-and-vectors)。

## 配置和解除配置記憶體
<a name="allocating-and-deallocating-memory"></a>

 **配置或取消配置記憶體** 

1. 子類別`MemorySystemInterface`：`aws/core/utils/memory/MemorySystemInterface.h`。

   ```
   class MyMemoryManager : public Aws::Utils::Memory::MemorySystemInterface
   {
   public:
       // ...
       virtual void* AllocateMemory(
           std::size_t blockSize, std::size_t alignment,
           const char *allocationTag = nullptr) override;
       virtual void FreeMemory(void* memoryPtr) override;
   };
   ```
**注意**  
您可以`AllocateMemory`視需要變更 的類型簽章。

1. 使用 `Aws::SDKOptions` 結構來設定自訂記憶體管理員的使用。將結構的執行個體傳遞至 `Aws::InitAPI`。在應用程式終止之前，必須使用`Aws::ShutdownAPI`相同的執行個體呼叫 來關閉 SDK。

   ```
   int main(void)
   {
     MyMemoryManager sdkMemoryManager;
     SDKOptions options;
     options.memoryManagementOptions.memoryManager = &sdkMemoryManager;
     Aws::InitAPI(options);
   
     // ... do stuff
   
     Aws::ShutdownAPI(options);
   
     return 0;
   }
   ```

## STL 和 AWS 字串和向量
<a name="stl-and-aws-strings-and-vectors"></a>

使用記憶體管理員初始化時， 會將所有配置和解除配置 適用於 C\$1\$1 的 AWS SDK 延遲至記憶體管理員。如果記憶體管理員不存在，開發套件會使用全域新增和刪除。

如果您使用自訂 STL 分配器，則必須變更所有 STL 物件的類型簽章，以符合配置政策。由於 STL 在 SDK 實作和界面中顯著使用，因此 SDK 中的單一方法會禁止將預設 STL 物件直接傳遞至 SDK 或控制 STL 配置。或者，混合式方法在內部使用自訂分配器，並允許界面上的標準和自訂 STL 物件，可能會使調查記憶體問題更加困難。

解決方案是使用記憶體系統的編譯時間常數`USE_AWS_MEMORY_MANAGEMENT`來控制開發套件使用的 STL 類型。

如果啟用編譯時間常數 （開啟），則類型會解析為具有連接到 AWS 記憶體系統的自訂分配器的 STL 類型。

如果停用編譯時間常數 （關閉），所有`Aws::*`類型都會解析為對應的預設`std::*`類型。

 **開發套件中 `AWSAllocator.h` 檔案的範例程式碼** 

```
#ifdef USE_AWS_MEMORY_MANAGEMENT

template< typename T >
class AwsAllocator : public std::allocator< T >
{
   ... definition of allocator that uses AWS memory system
};

#else

template< typename T > using Allocator = std::allocator<T>;

#endif
```

在範例程式碼中， `AwsAllocator` 可以是自訂分配器或預設分配器，取決於編譯時間常數。

 **開發套件中 `AWSVector.h` 檔案的範例程式碼** 

```
template<typename T> using Vector = std::vector<T, Aws::Allocator<T>>;
```

在範例程式碼中，我們會定義`Aws::*`類型。

如果啟用編譯時間常數 （開啟），則類型會使用自訂記憶體配置和 AWS 記憶體系統對應至向量。

如果停用編譯時間常數 （關閉），則類型會映射到`std::vector`具有預設類型參數的規則。

類型別名用於 SDK 中執行記憶體配置的所有`std::`類型，例如容器、字串串流和字串緩衝區。 適用於 C\$1\$1 的 AWS SDK 使用這些類型。

## 剩餘問題
<a name="remaining-issues"></a>

您可以在 SDK 中控制記憶體配置；不過，STL 類型仍然會透過對模型物件`initialize`和`set`方法的字串參數來主導公有界面。如果您不使用 STL 並改用字串和容器，則每當您想要進行服務呼叫時，都必須建立許多臨時項目。

為了在使用非 STL 進行服務呼叫時移除大多數臨時和配置，我們實作了以下內容：
+ 每個接受字串的 Init/Set 函數都有一個需要 的過載`const char*`。
+ 每個採用容器的 Init/Set 函數 （映射/向量） 都有一個採用單一項目的新增變體。
+ 每個接受二進位資料的 Init/Set 函數都有一個過載，該過載會將指標指向資料和`length`值。
+ （選用） 每個接受字串的 Init/Set 函數都有一個過載，其需要一個非零的終止`const char*`和一個`length`值。

## 原生 SDK 開發人員和記憶體控制
<a name="native-sdk-developers-and-memory-controls"></a>

請遵循 SDK 程式碼中的下列規則：
+ 請勿使用 `new`和 `delete`；請`Aws::Delete<>`改用 `Aws::New<>`和 。
+ 請勿使用 `new[]`和 `delete[]`；請使用 `Aws::NewArray<>`和 `Aws::DeleteArray<>`。
+ 請勿使用 `std::make_shared`；請使用 `Aws::MakeShared`。
+ 將 `Aws::UniquePtr`用於單一物件的唯一指標。使用 `Aws::MakeUnique`函數建立唯一的指標。
+ 將 `Aws::UniqueArray`用於物件陣列的唯一指標。使用 `Aws::MakeUniqueArray`函數建立唯一的指標。
+ 不要直接使用 STL 容器；使用其中一個 `Aws::` typedefs 或為您想要的容器新增 typedef。例如：

  ```
  Aws::Map<Aws::String, Aws::String> m_kvPairs;
  ```
+ `shared_ptr` 用於傳遞至 SDK 並受其管理的任何外部指標。您必須使用符合物件配置方式的銷毀政策來初始化共用指標。如果 SDK 預期不會清除指標，您可以使用原始指標。