带指针参数的 C++ 函数

标签 c++ xcode pointers memory-management

我正在编写一个 C++ 程序,将数据输出到一个文件,生成一个 python 脚本并调用 pyplot 进行绘图。

但是,当我用指针传递参数时,它可以正常编译,但不能运行。它返回错误。当我使用 Xcode Debug模式 并逐步执行它时,它偶尔会给出正确的结果,但并非总是如此。有时它也会返回错误。

我怀疑这可能是由某些内存分配问题引起的,但我无法确定到底是什么问题。

我的代码如下:

1)主要

#include <iostream>
#include <stdlib.h>
#include <cmath>
#include "PyCPlot.h"

using namespace std;

double pi = 3.1415926;

int main(int argc, const char * argv[]) {

    int nline = 100;

    double * np_list = new double(nline);
    double * pack_fraction_np = new double (nline);

    for (int i=0; i<nline; i++){
        np_list[i] = double(i)/double(nline)*2*pi;
        pack_fraction_np[i] = cos(np_list[i]);
    }

    PyCPlot_data_fout("RandomPacking", nline, np_list, pack_fraction_np);
    PyCPlot_pythonscript("RandomPacking", "Random Packing");
    PyCPlot_pyplot("RandomPacking", "Random Packing");

    return 0;
}

2)头文件

#ifndef PyCPlot_h
#define PyCPlot_h

#include <iostream>
#include <cmath>
#include <fstream>
#include <string>
#include <stdlib.h>

using namespace std;


int PyCPlot_data_fout(string datafilename, int nline, double * x, double *y){
    ofstream fout;
    fout.open(datafilename+".txt");
    fout << nline << endl;
    for (int i=0; i<nline; i++){
        fout << x[i] << "  " << y[i] << endl;
    }
    fout.close();
    return 0;
}

int PyCPlot_pythonscript(string datafilename, string plttitle){

    string strhead = "import numpy as np\nimport matplotlib.pyplot as plt\n";
    string strpltfig = "plt.figure()\n";
    string strpltplt = "plt.plot(xlist, ylist)\n";
    string strplttit = "plt.title('"+plttitle+"')\n";
    string strpltshw = "plt.show()\n";

    string strfileopen ="f = open('"+datafilename+".txt', 'r')\n";
    string strreadline ="size = map(int, f.readline().split())\n";
    string strpltlist ="xlist = np.zeros((size))\nylist = np.zeros((size))\n";
    string strfor = "for i in range(size[0]):\n    xlist[i], ylist[i] = map(float, f.readline().split())\n";

    ofstream pyout;
    pyout.open("PyCPlot_"+datafilename+".py");
    pyout << strhead << strfileopen << strreadline << strpltlist << strfor;
    pyout << strpltfig << strpltplt << strplttit << strpltshw;
    pyout.close();
    return 0;
}

int PyCPlot_pyplot(string datafilename, string plttitle){

    string strsystemsh ="source ~/.bashrc; python PyCPlot_"+datafilename+".py";
    system(strsystemsh.c_str());

    return 0;
}

#endif /* PyCPlot_h */

运行时出现以下错误信息

malloc: *** error for object 0x1002002e8: incorrect checksum for freed object - object was probably modified after being freed.

最佳答案

你想传递一个数组,所以传递一个可以在运行时调整大小的实际数组 (std::vector),而不是一些希望指向一个数组的第一个元素的随机指针数组(在本例中,它不是)

您的错误是使用 new double(x) 而不是 new double[x]。前者分配一个值等于xdouble,后者分配一个大小为xdouble数组code> 并返回指向第一个元素的指针,但是,正如我所说,如果您实际使用了 std::vector 而不是像90 年代初的风格(更不用说,如果您使用 std::vector,就不会发生内存泄漏)。

关于带指针参数的 C++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45362542/

相关文章:

iphone - 删除 iPhone 普通键盘中的完成按钮

c++ - 根据配置具有不同值的用户宏

ios - 具有透明背景的 Swift 导航 Controller View

android - "/system/bin/linker: No such file or directory"尝试编译 TensorFlow 时出错

objective-c - 将实现协议(protocol)的 Swift 类导入 Objective-C 类

c++ - 将 char 指针数组传递给函数

c++ - 类型定义指针类型

c - a[n] 真的可以与 *(a+n) 互换吗 - 为什么 sizeof 返回两个不同的答案?

c++ - 如何在 block 中使用 std::fstream?

c++ - 修改递归字符串反转函数