【问题标题】:c++ how to free memory *char?c++如何释放内存*char?
【发布时间】:2013-02-17 23:11:02
【问题描述】:

如何通过类似这样的方式释放内存(Visual Studio 2008 - Win32/console):

我只能包括:iostream

#include <iostream>

void data_t(char *test[])
{
    test[0] = new char[];
    test[1] = new char[];
    test[0] = "Test1";
    test[1] = "Test2";
}

int main()
{
    char *test[2];
    data_t(test);
    cout<<test[0]<<"\n";
    cout<<test[1]<<"\n";
    delete[] test[0];//Debug assertion failed! - The program '[7884] Zadanie_4_sortowanie.exe: Native' has exited with code 3 (0x3).
    delete[] test[1];
}

我做错了什么?

【问题讨论】:

  • new char[] 是什么意思?它不是合法的 C++。
  • 很遗憾,MSVS 接受了这种事情。我想知道它有什么用?
  • 字符指针上的赋值运算符不会复制数据,它只是更改它只是分配指针。因此,假设您将new[]s 固定为new[6],这样这两行就可以通过将两个指针重定向到字符串文字来立即泄漏内存。发生错误是因为您只能使用 delete[] 分配的东西 new[] 并且这些指针当前指向文字。短版,如果可以,请使用std:string,如果必须使用空终止字符缓冲区,请理解 c 字符串操作。
  • 我确定数组索引是错字。你不能释放字符串文字。啊啊啊。必须... 使用.... STRCPY... 使... 教授... 感觉... 很好.. 关于成为... SO.. OLD... AS... TO ... KNOW .....C

标签: c++ memory char free


【解决方案1】:

test[0] 包含一个指向静态字符串“Test1”的指针,它不能被释放。使用 strcpy 复制 C 字符串。

【讨论】:

  • 是的。真正的问题。考虑到代码声称符合,忽略数组大小的问题可能是一个错字。
【解决方案2】:

char[] 是不完整的类型,不能在new 表达式中使用。您需要实际决定数组大小,例如:

char * p = new char[200];

然后你可以在完成后说delete[] p;

您将需要类似strcpy 的东西来将数据复制到char 数组中。您编写的分配仅覆盖指针,从而丢失动态分配的跟踪(即泄漏)。 (事实上​​,如果你只想要固定字符串,你可能根本不需要动态分配,所以只需删除其中包含newdelete 的行。)


不过,您真正想要的是std::array&lt;std::string, 2&gt;

#include <array>
#include <string>
#include <iostream>

std::array<std::string, 2> test =  { "Test1", "Test2" };
std::cout << test[0] << "\n" << test[1] << "\n";

或者通过引用传递:

void populate(std::array<std::string, 2> & a)
{
    a[0] = "Test1";
    a[1] = "Test2";
}

int main()
{
    std::array<std::string, 2> test;
    populate(test);
    // print ...
}

【讨论】:

  • 我还要提一下data_t() 会泄漏内存,并且在字符串文字上执行delete[] p 可能会造成麻烦
  • 但是我需要释放内存吗?我的代码有内存泄漏?
  • @wcale:你的代码甚至不应该编译......但是,如果这行得通,你会泄漏内存,因为你丢失了 new 表达式返回的指针。跨度>
  • @wcale:当您修复代码以使其编译时(通过向new char[] 添加具体大小),您将遇到内存泄漏,因为在执行test[0] = "Test1"test[1]="Test2" 时您正在重新分配 test[0]test[1] 而不释放它们先前指向的内存。然后在执行delete test[0] 时,您将尝试解除分配字符串文字,即未定义行为。 delete test[1] 也一样。
  • 我女朋友的老师说“它只能用于“iostream” - 这是带有快速排序的数据库...顺便说一句,上面的代码编译得很好,但在调试模式下我有错误。而且这个内存泄漏。这是我这个应用程序的最后一部分。
【解决方案3】:

由于您的程序在运行时使用“Test1”和“Test2”(它们由 cout 打印),编译器必须将它们保存在某个地方。它通过将它们都放入您的可执行文件来做到这一点。

由于它们都已经在您的可执行文件中,因此没有理由分配任何新内存。 所以你可以删除data_t中的前两行。

如果你这样做,你会得到一个编译器错误,虽然这个错误应该已经存在,它会抱怨你试图将一个字符串文字(“Test1”,“Test2”)分配给一个非 const 数组。

这里的问题是编译器保存到可执行文件中的字符串不能被修改。您只是在打印它们,但 data_t 不知道。要解决此问题,您应该使用const char * 而不是char *

如果您打算修改这些字符串,则需要分配新内存并将字符串复制到其中。

【讨论】:

    猜你喜欢
    • 2019-10-14
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 2018-04-19
    • 2020-06-23
    • 2015-09-13
    • 1970-01-01
    • 2013-11-15
    相关资源
    最近更新 更多