Pointer Unik
Dalam program C, lebih dari satu pointer dapat berisi alamat data. Penunjuk dikatakan membuat alias untuk data. Alias juga dibuat ketika pointer menunjuk pada variabel yang dideklarasikan. Fragmen kode berikut mengilustrasikan kedua metode alias ini:
int iAnInteger=50;
// The next statement makes ipAnIntegerPointer an
// alias for iAnInteger.
int *ipAnIntegerPointer = &iAnInteger;
// This statement creates an alias for ipAnIntegerPointer.
int *ipAnotherIntegerPointer = ipAnIntegerPointer;
Dalam program C biasa, Anda mungkin menentukan pohon biner menggunakan definisi berikut:
typedef struct _treetype
{
long lValue;
struct _treetype * left;
struct _treetype * right;
} TREETYPE;
TREETYPE * troot;
Lebih dari satu pointer dapat mengakses konten simpul pohon. Ini umumnya baik-baik saja untuk aplikasi yang tidak didistribusikan. Namun, gaya pemrograman ini menghasilkan kode dukungan RPC yang lebih rumit. Stub klien dan server memerlukan kode tambahan untuk mengelola data dan pointer. Kode stub yang mendasar harus menyelesaikan berbagai pointer ke alamat dan menentukan salinan data mana yang mewakili versi terbaru.
Jumlah pemrosesan dapat dikurangi jika Anda menjamin bahwa pointer Anda adalah satu-satunya cara aplikasi dapat mengakses area memori tersebut. Penunjuk masih dapat memiliki banyak fitur penunjuk C. Misalnya, dapat berubah antara nilai null dan non-null atau tetap sama. Contoh berikut mengilustrasikan langkah-langkah ini: Penunjuk null sebelum panggilan dan menunjuk ke string yang valid setelah panggilan:
Secara default, pengkompilasi MIDL menerapkan atribut penunjuk [ unik] ke semua pointer yang bukan parameter. Pengaturan default ini dapat diubah dengan atribut [ pointer_default].
Pointer unik memiliki karakteristik berikut:
- Ini dapat memiliki nilai null.
- Ini dapat berubah dari null ke non-null selama panggilan. Ketika nilai berubah menjadi non-null, memori baru dialokasikan saat dikembalikan.
- Ini dapat berubah dari non-null ke null selama panggilan. Ketika nilai berubah menjadi NULL, aplikasi bertanggung jawab untuk membebaskan memori.
- Nilai dapat berubah dari satu nilai non-null ke nilai lainnya.
- Penyimpanan yang menunjuk pointer unik tidak dapat diakses oleh penunjuk atau nama lain dalam operasi.
- Data pengembalian ditulis ke dalam penyimpanan yang ada jika penunjuk tidak memiliki nilai null.
Contoh berikut menunjukkan cara menentukan penunjuk unik.
/* IDL file */
[
uuid(ba209999-0c6c-11d2-97cf-00c04f8eea45),
version(1.0)
]
interface RefPtrInterface
{
void RemoteFn([in, unique] char *ach);
}
Dalam contoh ini, parameter ach adalah penunjuk unik ke data karakter yang dikirim ke server untuk diproses dengan rutinitas RemoteFn.