

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Manajemen memori di AWS SDK untuk C\$1\$1
<a name="memory-management"></a>

 AWS SDK untuk C\$1\$1 Ini menyediakan cara untuk mengontrol alokasi memori dan deallokasi di perpustakaan.

**catatan**  
Manajemen memori khusus hanya tersedia jika Anda menggunakan versi pustaka yang dibuat menggunakan konstanta waktu kompilasi yang ditentukan. `USE_AWS_MEMORY_MANAGEMENT`  
Jika Anda menggunakan versi pustaka yang dibangun tanpa konstanta waktu kompilasi, fungsi sistem memori global seperti tidak `InitializeAWSMemorySystem` akan berfungsi; global `new` dan `delete` fungsi digunakan sebagai gantinya.

Untuk informasi lebih lanjut tentang konstanta waktu kompilasi, lihat [STL dan AWS String dan Vektor](#stl-and-aws-strings-and-vectors).

## Mengalokasikan dan Menalokasikan Memori
<a name="allocating-and-deallocating-memory"></a>

 **Untuk mengalokasikan atau mengalokasikan memori** 

1. Subkelas`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;
   };
   ```
**catatan**  
Anda dapat mengubah jenis tanda tangan `AllocateMemory` sesuai kebutuhan.

1. Gunakan `Aws::SDKOptions` struct untuk mengonfigurasi penggunaan manajer memori kustom. Lulus instance struct ke dalam`Aws::InitAPI`. Sebelum aplikasi berakhir, SDK harus dimatikan `Aws::ShutdownAPI` dengan memanggil dengan instance yang sama. 

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

## STL dan AWS String dan Vektor
<a name="stl-and-aws-strings-and-vectors"></a>

Ketika diinisialisasi dengan manajer memori, menunda AWS SDK untuk C\$1\$1 semua alokasi dan deallokasi ke manajer memori. Jika manajer memori tidak ada, SDK menggunakan global new dan delete.

Jika Anda menggunakan pengalokasi STL kustom, Anda harus mengubah tanda tangan tipe untuk semua objek STL agar sesuai dengan kebijakan alokasi. Karena STL digunakan secara mencolok dalam implementasi dan antarmuka SDK, pendekatan tunggal dalam SDK akan menghambat penerusan langsung objek STL default ke SDK atau kontrol alokasi STL. Bergantian, pendekatan hibrid—menggunakan pengalokasi kustom secara internal dan memungkinkan objek STL standar dan kustom pada antarmuka—berpotensi membuat lebih sulit untuk menyelidiki masalah memori.

Solusinya adalah dengan menggunakan konstanta waktu kompilasi sistem memori `USE_AWS_MEMORY_MANAGEMENT` untuk mengontrol jenis STL mana yang digunakan SDK.

Jika konstanta waktu kompilasi diaktifkan (aktif), tipe akan diselesaikan ke tipe STL dengan pengalokasi khusus yang terhubung ke sistem memori. AWS 

Jika konstanta waktu kompilasi dinonaktifkan (mati), semua `Aws::*` tipe menyelesaikan ke tipe default `std::*` yang sesuai.

 **Contoh kode dari `AWSAllocator.h` file di SDK** 

```
#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
```

Dalam kode contoh, `AwsAllocator` dapat berupa pengalokasi khusus atau pengalokasi default, tergantung pada konstanta waktu kompilasi.

 **Contoh kode dari `AWSVector.h` file di SDK** 

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

Dalam kode contoh, kita mendefinisikan `Aws::*` tipe.

Jika konstanta waktu kompilasi diaktifkan (aktif), jenis peta ke vektor menggunakan alokasi memori kustom dan sistem memori. AWS 

Jika konstanta waktu kompilasi dinonaktifkan (mati), tipe akan dipetakan ke reguler `std::vector` dengan parameter tipe default.

Jenis aliasing digunakan untuk semua `std::` tipe di SDK yang melakukan alokasi memori, seperti container, string stream, dan buffer string. AWS SDK untuk C\$1\$1 Penggunaan jenis-jenis ini.

## Masalah yang Tersisa
<a name="remaining-issues"></a>

Anda dapat mengontrol alokasi memori di SDK; Namun, tipe STL masih mendominasi antarmuka publik melalui parameter string ke objek model dan metode. `initialize` `set` Jika Anda tidak menggunakan STL dan menggunakan string dan wadah sebagai gantinya, Anda harus membuat banyak temporari kapan pun Anda ingin melakukan panggilan layanan.

Untuk menghapus sebagian besar sementara dan alokasi saat Anda melakukan panggilan layanan menggunakan non-STL, kami telah menerapkan hal berikut:
+ Setiap Init/Set fungsi yang mengambil string memiliki kelebihan beban yang membutuhkan`const char*`.
+ Setiap Init/Set fungsi yang mengambil wadah (peta/vektor) memiliki varian add yang mengambil satu entri.
+ Setiap Init/Set fungsi yang mengambil data biner memiliki kelebihan beban yang mengambil pointer ke data dan nilai. `length`
+ (Opsional) Setiap Init/Set fungsi yang mengambil string memiliki kelebihan beban yang membutuhkan non-nol dihentikan `const char*` dan nilai. `length`

## Pengembang SDK Asli dan Kontrol Memori
<a name="native-sdk-developers-and-memory-controls"></a>

Ikuti aturan ini dalam kode SDK:
+ Jangan gunakan `new` dan`delete`; gunakan `Aws::New<>` dan `Aws::Delete<>` sebagai gantinya.
+ Jangan gunakan `new[]` dan`delete[]`; gunakan `Aws::NewArray<>` dan`Aws::DeleteArray<>`.
+ Jangan gunakan`std::make_shared`; gunakan`Aws::MakeShared`.
+ Gunakan `Aws::UniquePtr` untuk pointer unik ke satu objek. Gunakan `Aws::MakeUnique` fungsi untuk membuat pointer unik.
+ Gunakan `Aws::UniqueArray` untuk pointer unik ke array objek. Gunakan `Aws::MakeUniqueArray` fungsi untuk membuat pointer unik.
+ Jangan langsung menggunakan kontainer STL; gunakan salah satu `Aws::` typedefs atau tambahkan typedef untuk wadah yang Anda inginkan. Contoh:

  ```
  Aws::Map<Aws::String, Aws::String> m_kvPairs;
  ```
+ Gunakan `shared_ptr` untuk pointer eksternal apa pun yang diteruskan dan dikelola oleh SDK. Anda harus menginisialisasi pointer bersama dengan kebijakan penghancuran yang cocok dengan cara objek dialokasikan. Anda dapat menggunakan pointer mentah jika SDK tidak diharapkan untuk membersihkan pointer.