【问题标题】:how can i delete dynamic array created in a function如何删除在函数中创建的动态数组
【发布时间】:2019-07-29 11:25:00
【问题描述】:

我必须编写一个程序(不使用向量,也不使用结构或 OOP)来计算两个多项式的和和乘积。 这是我的代码:

//Task 4.19 & 4.20
#include <iostream>
#include <cmath>
double* definePoly(char& symbol, char& coef, int& k)
{
    std::cout << "deg(" << symbol << "(x)) = ";
    std::cin >> k;
    symbol++;
    double* a = new double[k];
    for (int i = k; i >= 0; i--)
    {
        std::cout << coef << "_{" << i << "} = ";
        std::cin >> a[i];
    }
    coef++;
    return a;
}
void printPoly(int n, double* P, char& symbol)
{
    symbol--;
    std::cout << symbol << "(x)=";
    for (int i = n; i >= 0; i--)
    {
        if (P[i] != 0)
        {
            if (P[i] > 0)
            {
                std::cout << '+';
            }
            std::cout.setf(std::ios::fixed);
            std::cout.precision(2);
            std::cout << P[i] << ".x^{" << i << "}";
        }
    }
    std::cout << "\n";
    symbol++;
}
double* sumPoly(double* a, int n, double* b, int m, char& symbol)
{ // Task 4.19
    symbol++;
    double* c = new double[(n + m + abs(n - m)) / 2];
    if (n > m)
    {
        for (int i = 0; i <= m; i++) c[i] = a[i] + b[i];
        for (int i = m + 1; i <= n; i++) c[i] = a[i];
    }
    else if (n < m)
    {
        for (int i = 0; i <= n; i++) c[i] = a[i] + b[i];
        for (int i = n + 1; i <= m; i++) c[i] = b[i];
    }
    else for (int i = 0; i <= n; i++)c[i] = a[i] + b[i];
    return c;
}
double* prodPoly(double* a, int n, double* b, int m, char& symbol)
{ // Task 4.20
    symbol++;
    double* d = new double[n + m];
    for (int p = 0; p <= n + m; p++)
    {
        d[p] = 0;
        for (int i = 0; i <= n; i++)
            for (int j = 0; j <= m; j++)
                if (i + j == p) d[p] = d[p] + a[i] * b[j];
    }
    return d;
}
int main()
{
    int n, m;
    char symbol('P'), coef('a');

    double* firstPoly = definePoly(symbol, coef, n);
    printPoly(n, firstPoly, symbol);

    double* secondPoly = definePoly(symbol, coef, m);
    printPoly(m, secondPoly, symbol);

    double* sum = sumPoly(firstPoly, n, secondPoly, m, symbol);
    std::cout << "Sum:\n";
    printPoly((n + m + abs(n - m)) / 2, sum, symbol);

    double* prod = prodPoly(firstPoly, n, secondPoly, m, symbol);
    std::cout << "Product:\n";
    printPoly(n + m, prod, symbol);

    /*delete[] firstPoly;
    delete[] secondPoly;
    delete[] sum;
    delete[] prod;*/

    return 0;
}

完美地工作,但是当我取消注释删除时,Visual Studio 告诉我有错误,否则有泄漏。

如何删除/释放内存以解决此问题?

【问题讨论】:

  • 什么如果您尝试delete[] 数组,您会得到什么“错误”?你确定你没有超出分配的内存范围吗? definePoly 函数肯定超出范围。
  • "visual studio 告诉我有错误"什么错误?请将其包含在问题中
  • 如果取消注释 deletes 会发生什么?乍一看,这应该有效。另外,必要的注释:使用std::vector 而不是手动内存管理。
  • 在这里编译得很好:wandbox.org/permlink/nMPPpQ4LmRyipfcv
  • 如果堆分配指针的删除不起作用,它会告诉您您的程序有错误,而不是您错误地执行了删除。新程序员经常认为错误是由删除引起的,但几乎总是在删除之前的某个时间出现问题,这才是真正的错误。

标签: c++ memory dynamic


【解决方案1】:
double* a = new double[k];
for (int i = k;
    std::cin >> a[i];

k 元素数组的最后一个元素的索引是k - 1 您在所有循环中都可以越界访问数组(这只是其中之一)。程序的行为未定义。

如何删除函数中创建的动态数组

就像您要删除在函数外部创建的动态数组一样,就像您试图删除它一样:

delete[] firstPoly; // etc

但是您必须确保您的程序不会因未定义的行为而破坏自己的内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 2022-08-06
    • 1970-01-01
    • 2020-07-19
    • 2019-05-23
    • 2014-11-01
    • 2019-10-14
    相关资源
    最近更新 更多