Эта последовательность утверждений
char* s = new char[150];
s="abcdef";
приводит к утечке памяти, потому что сначала память была выделена, а ее адрес был назначен указателю s
, а затем указатель был переназначен с адресом строкового литерала "abcdef"
. Более того, строковые литералы в C ++ (напротив C) имеют типы постоянных символьных массивов.
Если вы выделили память для строки, вам следует скопировать строку в память, используя стандартную функцию C strcpy
или стандартную функцию C strncpy
.
Например
char* s = new char[150];
std::strcpy( s, "abcdef" );
Или
const size_t N = 150;
char* s = new char[N];
std::strncpy( s, "abcdef", N );
s[N-1] = '\0';
Или даже следующим образом
#include <iostream>
#include <cstring>
int main()
{
const size_t N = 150;
char *s = new char[N]{ '\0' };
std::strncpy( s, "abcdef", N - 1 );
std::cout << s << '\n';
delete []s;
}
В любом случае лучше просто использовать стандартный класс std::string
.
std::string s( "abcdef" );
или например
std::string s;
s.assign( "abcdef" );