【发布时间】:2017-11-09 11:47:46
【问题描述】:
为什么我不能执行以下行?
delete [] target;
在我的情况下?
代码如下:
main.cpp
#include <iostream>
using namespace std;
#include "Char.h"
int main()
{
char * text = "qwerty";
char * a = new char[charlen(text)+1];
copyon(a,text);
cout<<a<<endl;
char * test = "asdfghjkl";
assign(&a, test);
assign(&a, a);
char * test1 = new char[26];
for (int i(0); i < 26; i++)
{
test1[i] = char(i+65);
}
test1[26] = '\0';
anotherAssign(test1, a);
cout << test1 << endl;
return 0;
}
Char.cpp
#include "Char.h"
#include <iostream>
#include <cassert>
#include <cstring>
size_t charlen(const char * ps)
{
size_t len=0;
while (ps[len++]);
assert(len-1==strlen(ps));
return len;
}
void assign(char** target, const char* source)
{
if (*target==source)
return;
delete [] *target;
*target = new char[charlen(source)+1];
copyon(*target, source);
return;
}
void anotherAssign(char* target, const char* source)
{
if (target==source)
return;
delete [] target;
target = new char[charlen(source)+1];
copyon(target, source);
return;
}
void copyon(char* const target, const char* const source)
{
char * t = target;
const char * s = source;
while (*t++ = *s++);
//while(*target++ = *source++)
// ;
std::cout << target << " source = " << source << std::endl;
return;
size_t len = charlen(source);
//for (size_t i=0; i<len; ++i)
// target[i]=source[i];
//target[len]='\0';
}
这里有一个例外:
【问题讨论】:
-
1) "和using有什么区别: <...>" 你了解pass-by-value和pass-by-reference的区别吗? 2) 在检查变量中的值时,您是否尝试使用调试器单步执行代码?
-
是的。我试图这样做。我的问题不是关于你所说的差异,而是关于我的情况的差异。
-
"我的问题不是关于你所说的差异,而是关于我的情况的差异。" 差异是完全一样的。
-
@AlgirdasPreidžius,知道了,非常感谢。
-
语句
test1[26] = '\0';给出了未定义的行为,因为test1已分配给new char[26]。一旦发生未定义行为的实例,任何随后执行的代码也可能会出现错误行为,无论它是否存在缺陷 - 在您的情况下,包括调用anotherAssign()或它执行的任何代码。
标签: c++ arrays pointers character delete-operator