polin11, утечка произошла уже в 25-й строке: в 21-й память по указателю была выделена, а адрес, где именно выделена, записано в указателе и нигде больше, потом в 25-й строке указателю присвиваеется значение функции, которая тоже что то выделила и вернула адрес, где именно выделила. Так как указатель поменял свою значение при этом присваивании, то старое значение с адресом выдения в 21-й строке потерялось. Раз ты по этому указателю выделял память, то прежде чем менять его значение, надо память освободить. Совсем другое дело Код | char *p; char *i; p=new char [256]; i=p; do { ++i; /*Память выделена по p, а меняется i, это разные указатели, адрес всего блока выделенной памяти в p остаётся, i же используется для перебора. В этом случае ничего освобождать не нужно*/ } while ((i-p)<256);
|
, но и тогда p надо освободить после использования. Если это локальная автоматическая переменная функции и значение этой переменной наружу не выдаётся, то в любом месте функции до её завершения, но не раньше, чем блок выделенной памяти станет не нужен. Если глобальная, то до завершения программы, но опять таки после того, как выделенный блок станет не нужен, а если это переменная, значение которой выдаётся наружу, то где то в вызывающем коде, но опять таки до его завершения, но не раньше, чем сам выделенный блок станет не нужен. |