PPP Stroustrup 练习 - 将 C 风格的字符串复制到它在自由存储上分配的内存中
PPP Stroustrup exercise - copy a C-style string into memory it allocates on the free store
我正在解决 Stroustrup 的 PPP 书中的以下练习 (17.4):
Write a function char* strdup(const char* )
that copies a C-style string into memory it allocates on the free store. Don't use any standard library function.
这是我的实现,编译得很好。我对 运行 函数时发现的错误消息有疑问。
#include <iostream>
#include <string>
char* strdup(const char* s) {
if (s==0) return 0;
// get number of char in s
int n = 0;
while (s[n] != 0)
++n;
// allocate memory with room for terminating 0
char* pc = new char[n+1];
// copy string
for (int i = 0; s[i]; ++i)
pc[i] = s[i];
pc[n] = 0; // zero at the end: it's a C-style string
delete[] s;
return pc;
}
int main()
try {
std::string str;
char* cstr;
while (std::cin>>str && str!="quit") {
cstr = strdup(&str[0]);
std::cout << cstr << "\n";
delete[] cstr;
}
}
catch (std::exception& e) {
std::cerr << "exception: " << e.what() << std::endl;
}
catch (...) {
std::cerr << "exception\n";
}
它可以编译,但是当我 运行 它和我写第一个字符时,我有一个 pointer being freed was not allocated
错误。如果我删除 delete[] s
,那么我就没有内存泄漏,而且 运行 就好了。但为什么(显然)不 delete[]
s
是正确的?是不是因为没有分配new
?
A std::string
确实管理它用来存储字符串的内存。在 main
你做
std::string str;
和
cstr = strdup(&str[0]);
但是您的 strdup
调用了 delete[] s;
参数。
这是你已经知道的。现在考虑 std::string
的析构函数在超出范围时确实已经清理了内存。 std::string
使用的缓冲区不能被删除两次。您不得在 &str[0]
上致电 delete
。您只需要 delete
您通过 new
.
创建的对象
还有小串优化。在这种情况下 &str[0]
不指向您可以删除的堆分配缓冲区。
PS:当您应该使用 nullptr
作为指针而使用 '[=25=]'
作为空终止符时,您正在使用 0
。
我正在解决 Stroustrup 的 PPP 书中的以下练习 (17.4):
Write a function
char* strdup(const char* )
that copies a C-style string into memory it allocates on the free store. Don't use any standard library function.
这是我的实现,编译得很好。我对 运行 函数时发现的错误消息有疑问。
#include <iostream>
#include <string>
char* strdup(const char* s) {
if (s==0) return 0;
// get number of char in s
int n = 0;
while (s[n] != 0)
++n;
// allocate memory with room for terminating 0
char* pc = new char[n+1];
// copy string
for (int i = 0; s[i]; ++i)
pc[i] = s[i];
pc[n] = 0; // zero at the end: it's a C-style string
delete[] s;
return pc;
}
int main()
try {
std::string str;
char* cstr;
while (std::cin>>str && str!="quit") {
cstr = strdup(&str[0]);
std::cout << cstr << "\n";
delete[] cstr;
}
}
catch (std::exception& e) {
std::cerr << "exception: " << e.what() << std::endl;
}
catch (...) {
std::cerr << "exception\n";
}
它可以编译,但是当我 运行 它和我写第一个字符时,我有一个 pointer being freed was not allocated
错误。如果我删除 delete[] s
,那么我就没有内存泄漏,而且 运行 就好了。但为什么(显然)不 delete[]
s
是正确的?是不是因为没有分配new
?
A std::string
确实管理它用来存储字符串的内存。在 main
你做
std::string str;
和
cstr = strdup(&str[0]);
但是您的 strdup
调用了 delete[] s;
参数。
这是你已经知道的。现在考虑 std::string
的析构函数在超出范围时确实已经清理了内存。 std::string
使用的缓冲区不能被删除两次。您不得在 &str[0]
上致电 delete
。您只需要 delete
您通过 new
.
还有小串优化。在这种情况下 &str[0]
不指向您可以删除的堆分配缓冲区。
PS:当您应该使用 nullptr
作为指针而使用 '[=25=]'
作为空终止符时,您正在使用 0
。