Это гарантированно работает со значительными оговорками.
Все предостережения сводятся к двум основным проблемам, которые объединяются таким образом, что это не очень приятно:
- В вашей всей программе есть только один экземпляр
String
.
String
не является константой.
Это вызовет у вас множество интересных вопросов. Например, если вы вызовете __str__
еще раз где-нибудь в вашей программе, любой, кто сохранит копию const char *
, которую вы ему передали, может в итоге иметь недействительный указатель. И даже если это не так, они в конечном итоге будут содержать указатель на память, которая изменилась. Короче говоря, результатом будет неопределенное поведение.
Другой пример, если вы вызываете __str__
из более чем одного потока, в какой-то момент он взорвется, поскольку оба потока попытаются одновременно изменить String
.
К счастью, у вас нет проблемы статического порядка инициализации. String
гарантированно будет инициализирован при первом вызове __str__
.
Вы можете решить проблему String
, оставаясь вечно, позвонив по номеру String.clear()
в __str__
, если вы уверены, что ни у кого нет никаких const char *
s, указывающих на состояние вашего String
. String.clear()
освободит любое хранилище, которое оно может использовать.
Лично я бы использовал это только как метод последней инстанции. Возможность случайных частей программы, сжимающих указатель, беспокоит меня бесконечно. Нет четкого показателя времени жизни этого указателя, за исключением того факта, что он не может быть гарантированно работать, если __str__
когда-либо будет вызван снова. Но опять же, это может зависеть от того, что именно делает __str__
.
Кроме того, __str__
- это плохое имя для использования. Имена, содержащие два последовательных подчеркивания, зарезервированы для реализации C ++.