【问题标题】:Can not delete char pointer in C++无法在 C++ 中删除 char 指针
【发布时间】:2017-11-09 11:47:46
【问题描述】:

为什么我不能执行以下行?

delete [] target;

在我的情况下?

代码如下:

ma​​in.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


【解决方案1】:

如果你这样做:

char * test1 = new char[26];

那么您的数组将从test1[0] 变为test1[25]

这意味着:

test1[26] = '\0';

超出范围。此时,头部已损坏,接下来发生的事情是未定义的(但很少需要)。

【讨论】:

    猜你喜欢
    • 2020-05-10
    • 2021-11-26
    • 2017-09-10
    • 1970-01-01
    • 1970-01-01
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多