

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

# Speicherverwaltung in der AWS SDK für C\$1\$1
<a name="memory-management"></a>

Das AWS SDK für C\$1\$1 bietet eine Möglichkeit, die Speicherzuweisung und -freigabe in einer Bibliothek zu steuern.

**Anmerkung**  
Benutzerdefinierte Speicherverwaltung ist nur verfügbar, wenn Sie eine Version der Bibliothek verwenden, die mit der definierten Kompilierzeitkonstante erstellt wurde. `USE_AWS_MEMORY_MANAGEMENT`  
Wenn Sie eine Version der Bibliothek verwenden, die ohne die Kompilierzeitkonstante erstellt wurde, funktionieren globale Speichersystemfunktionen wie z. B. `InitializeAWSMemorySystem` nicht. Stattdessen werden die globalen `delete` Funktionen `new` und verwendet.

Weitere Hinweise zur Kompilierzeitkonstante finden Sie unter [STL](#stl-and-aws-strings-and-vectors) und Strings and Vectors. AWS 

## Speicher zuweisen und Zuweisung aufheben
<a name="allocating-and-deallocating-memory"></a>

 **Um Speicher zuzuweisen oder die Zuweisung aufzuheben** 

1. Unterklasse`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;
   };
   ```
**Anmerkung**  
Sie können die Typsignatur für nach `AllocateMemory` Bedarf ändern.

1. Verwenden Sie die `Aws::SDKOptions` Struktur, um die Verwendung des benutzerdefinierten Speichermanagers zu konfigurieren. Übergeben Sie die Instanz der Struktur an`Aws::InitAPI`. Bevor die Anwendung beendet wird, muss das SDK heruntergefahren werden, indem es `Aws::ShutdownAPI` mit derselben Instanz aufgerufen wird. 

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

## STL und AWS Zeichenketten und Vektoren
<a name="stl-and-aws-strings-and-vectors"></a>

Bei der Initialisierung mit einem Speichermanager verschiebt der die AWS SDK für C\$1\$1 gesamte Zuweisung und Freigabe an den Speichermanager. Wenn kein Speichermanager vorhanden ist, verwendet das SDK die Optionen Global New und Delete.

Wenn Sie benutzerdefinierte STL-Allokatoren verwenden, müssen Sie die Typsignaturen für alle STL-Objekte so ändern, dass sie der Zuweisungsrichtlinie entsprechen. Da STL in der SDK-Implementierung und -Schnittstelle eine wichtige Rolle spielt, würde ein einziger Ansatz im SDK die direkte Übergabe von Standard-STL-Objekten an das SDK oder die Steuerung der STL-Zuweisung verhindern. Alternativ könnte ein hybrider Ansatz, bei dem intern benutzerdefinierte Zuordnungen verwendet und standardmäßige und benutzerdefinierte STL-Objekte auf der Schnittstelle zugelassen werden, die Untersuchung von Speicherproblemen potenziell erschweren.

Die Lösung besteht darin, die Kompilierzeitkonstante des Speichersystems zu verwenden, um zu steuern, welche STL-Typen das SDK verwendet. `USE_AWS_MEMORY_MANAGEMENT`

Wenn die Kompilierzeitkonstante aktiviert (on) ist, werden die Typen in STL-Typen aufgelöst, wobei ein benutzerdefinierter Allocator mit dem Speichersystem verbunden ist. AWS 

Wenn die Kompilierzeitkonstante deaktiviert (off) ist, werden alle `Aws::*` Typen in den entsprechenden Standardtyp aufgelöst. `std::*`

 **Beispielcode aus der `AWSAllocator.h` Datei im 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
```

Im Beispielcode `AwsAllocator` kann es sich je nach Kompilierzeitkonstante um einen benutzerdefinierten Allocator oder einen Standard-Allocator handeln.

 **Beispielcode aus der Datei im SDK `AWSVector.h`** 

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

Im Beispielcode definieren wir die `Aws::*` Typen.

Wenn die Kompilierzeitkonstante aktiviert (on) ist, wird der Typ mithilfe der benutzerdefinierten Speicherzuweisung und des AWS Speichersystems einem Vektor zugeordnet.

Wenn die Kompilierzeitkonstante deaktiviert (off) ist, wird der Typ einem regulären Typ `std::vector` mit Standard-Typparametern zugeordnet.

Typaliasing wird für alle `std::` Typen im SDK verwendet, die die Speicherzuweisung vornehmen, z. B. für Container, Zeichenfolgenstreams und Zeichenkettenpuffer. The AWS SDK für C\$1\$1 verwendet diese Typen.

## Verbleibende Probleme
<a name="remaining-issues"></a>

Sie können die Speicherzuweisung im SDK steuern. STL-Typen dominieren jedoch weiterhin die öffentliche Schnittstelle über Zeichenkettenparameter für das Modellobjekt `initialize` und die `set` Methoden. Wenn Sie STL nicht verwenden und stattdessen Zeichenketten und Container verwenden, müssen Sie bei jedem Serviceaufruf eine Menge temporärer Dateien erstellen.

Um die meisten temporären Dateien und Zuweisungen zu entfernen, wenn Sie Serviceanfragen mit einem anderen Format als STL tätigen, haben wir Folgendes implementiert:
+ Jede Init/Set Funktion, die eine Zeichenfolge akzeptiert, hat eine Überladung, die eine benötigt. `const char*`
+ Jede Init/Set Funktion, die einen Container (Karte/Vektor) akzeptiert, hat eine Add-Variante, die einen einzigen Eintrag benötigt.
+ Jede Init/Set Funktion, die Binärdaten akzeptiert, hat eine Überladung, die einen Zeiger auf die Daten und einen `length` Wert benötigt.
+ (Optional) Jede Init/Set Funktion, die eine Zeichenfolge akzeptiert, hat eine Überladung, bei der ein Wert ungleich Null beendet `const char*` und ein `length` Wert angegeben wird.

## Native SDK-Entwickler und Speichersteuerungen
<a name="native-sdk-developers-and-memory-controls"></a>

Folgen Sie diesen Regeln im SDK-Code:
+ Verwenden Sie nicht `new` und`delete`; verwenden Sie `Aws::Delete<>` stattdessen `Aws::New<>` und.
+ Verwenden Sie nicht `new[]` und`delete[]`; verwenden Sie `Aws::NewArray<>` und`Aws::DeleteArray<>`.
+ Benutze nicht`std::make_shared`; benutze`Aws::MakeShared`.
+ Wird `Aws::UniquePtr` für eindeutige Zeiger auf ein einzelnes Objekt verwendet. Verwenden Sie die `Aws::MakeUnique` Funktion, um den eindeutigen Zeiger zu erstellen.
+ Wird `Aws::UniqueArray` für eindeutige Zeiger auf eine Reihe von Objekten verwendet. Verwenden Sie die `Aws::MakeUniqueArray` Funktion, um den eindeutigen Zeiger zu erstellen.
+ Verwenden Sie STL-Container nicht direkt. Verwenden Sie eine der `Aws::` Typedefs oder fügen Sie eine Typedef für den gewünschten Container hinzu. Beispiel:

  ```
  Aws::Map<Aws::String, Aws::String> m_kvPairs;
  ```
+ Verwenden Sie diese `shared_ptr` Option für alle externen Zeiger, die an das SDK übergeben und von diesem verwaltet werden. Sie müssen den gemeinsamen Zeiger mit einer Vernichtungsrichtlinie initialisieren, die der Art und Weise entspricht, wie das Objekt zugewiesen wurde. Sie können einen unbearbeiteten Zeiger verwenden, wenn nicht erwartet wird, dass das SDK den Zeiger bereinigt.