Питання - це переважно історичний артефакт, а не неможливість реалізації.
Спосіб побудови коду більшості компіляторів С полягає в тому, що компілятор одночасно бачить кожен вихідний файл; він ніколи не бачить всієї програми відразу. Коли один вихідний файл викликає функцію з іншого вихідного файлу або бібліотеки, все, що компілятор бачить, це файл заголовка з типом повернення функції, а не фактичний код функції. Це означає, що коли є функція, яка повертає вказівник, у компілятора немає способу визначити, чи потрібно звільнити пам'ять, на яку вказує вказівник, чи ні. Інформація для вирішення, яка не відображається компілятору в цей момент часу. Людина-програміст, з іншого боку, вільна шукати вихідний код функції або документацію, щоб з’ясувати, що потрібно зробити з покажчиком.
Якщо ви подивитесь на більш сучасні мови низького рівня, такі як C ++ 11 або Rust, ви побачите, що вони здебільшого вирішили проблему, зробивши явним право власності на пам'ять у типі вказівника. У C ++ ви б використовували unique_ptr<T>
замість простої T*
для утримання пам’яті, і unique_ptr<T>
гарантуєте, що пам'ять звільняється, коли об’єкт досягає кінця області, на відміну від звичайної T*
. Програміст може передати пам'ять від однієї unique_ptr<T>
до іншої, але коли-небудь може бути лише один unique_ptr<T>
вказівник на пам'ять. Тож завжди зрозуміло, кому належить пам’ять і коли її потрібно звільнити.
З міркувань зворотної сумісності C ++, як і раніше, дозволяє керувати пам'яттю в старому стилі і, таким чином, створювати помилки або способи обійти захист unique_ptr<T>
. Іржа ще більш сувора в тому, що вона застосовує правила власності на пам'ять за допомогою помилок компілятора.
Що стосується нерозбірливості, проблеми з зупинкою тощо, так, якщо ви дотримуєтесь C семантики, не можна визначитися з усіма програмами, коли слід звільнити пам'ять. Однак для більшості реальних програм, а не для навчальних занять чи програмного забезпечення для баггі, абсолютно можна було б вирішити, коли звільнитись, а коли ні. Це врешті-решт єдина причина, чому людина може зрозуміти, коли звільнитись чи ні в першу чергу.