C++析构函数删除共享内存
C++ destructor deletes shared memory
我在C++中有执行以下操作的程序:获取一个非排序的整数数组,并按递增顺序将其划分为子数组。 例如。 我的数组是 1,2,3,-2,4所以输出将是:1,2,3//子数组 1-2,4//子数组 2
我要求的方法是分配指针数组,该数组中的每个单元格将指向包含一个系列的子数组(也是动态分配的(。 另外,我不允许更改"main"函数
现在,我有"打印"方法,该方法使用运算符重载打印子数组。
我检查并发现打印方法工作正常,但在这段代码中:
cout << "ns3: n";
print(s3);
s3 = s1;
cout << "ns3 again: n";
print(s3);
print(s3( 打印正常,但是在再次调用 print(s3( 时赋值运算符之后,我得到了一个垃圾输出。 经过一些重复,我认为这是与析构函数有关的东西。
如果有人能指出并找出我的问题并提出解决方案,我非常感激。当然我会给出源代码
更新
我想更好地解释自己:每次调用"print"之后,当我跟踪时,在"print"之前执行的第一件事是复制构造函数。 当我在复制构造函数中设置断点时,我看到函数签名(复制构造函数(中的指针"src"指向正确的位置(数组中的第一个元素(, 但是在分配 s3=s1 之后,当我再次打印(s3( 时,复制构造函数中的指针是垃圾
**
这里的代码:
// HW4.cpp : Defines the entry point for the console application.
//
#include <iostream>
using namespace std;
//global declerations and indexes//
typedef long int * LONG_INT_PTR;
//class
class SeriesArray
{
//members declerations
private:
LONG_INT_PTR *stable;
int *count_arr; //help array that indicate how many serieses made from the array and how many element in each series
int count_size; // help counter
int size;
public:
SeriesArray::SeriesArray(LONG_INT_PTR arr, int n );
SeriesArray::SeriesArray(const SeriesArray& src );
SeriesArray::~SeriesArray();
long int SeriesArray::get_entry(int i,int j) const;
SeriesArray& SeriesArray::operator=(const SeriesArray& src);
friend ostream& operator<<(ostream& stream, const SeriesArray& src);//global - not member
};
//members implementation
//default constructor
SeriesArray::SeriesArray(LONG_INT_PTR arr, int n )
{
size=n;
int j=0;
int s=0;
count_size=0;
count_arr=new int[size];
for (int i=0;i<size;i++)
{
if (arr[i]<arr[i+1])
count_size++;
else
{
count_size++;
count_arr[j]=count_size;
j++;
count_size=0;
}
}
size=j;
stable=new LONG_INT_PTR[size];
for (int i=0;i<size;i++)
{
stable[i]=new long int[count_arr[i]];
for (int k=0;k<count_arr[i];k++)
{
stable[i][k]=arr[s];
s++;
}
}
}
//copy constructor
SeriesArray::SeriesArray(const SeriesArray& src )
{
size=src.size;
count_arr=new int[size];
stable=new LONG_INT_PTR[size];
for (int i=0;i<size;i++)
{
count_arr[i]=src.count_arr[i];
stable[i]=new long int[count_arr[i]];
}
memcpy(this->stable,src.stable,src.size*sizeof(long int));
}
//destructor
SeriesArray::~SeriesArray()
{
for (int i=0;i<size;++i)
delete[] stable[i];
delete[] this->count_arr;
count_size=0;
}
//member
long int SeriesArray::get_entry(int i,int j) const
{
if (i<this->count_size&&this->stable[i][j]!=NULL)
return (this->stable[i][j]);
else return NULL;
}
//overload = operator
SeriesArray& SeriesArray::operator=(const SeriesArray& src)
{
if (this==&src)
return *this;
if (stable!=NULL)
delete[] stable;
if (count_arr!=NULL)
delete[] count_arr;
//for (int i=0;i<size;i++)
// delete[] stable[i];
size=src.size;
count_arr=new int[src.size];
memcpy(count_arr,src.count_arr,src.size*sizeof(int));
stable=new LONG_INT_PTR[size];
for (int i=0;i<size;i++)
{
// count_arr[i]=rhs.count_arr[i];
stable[i]=new long int[src.count_arr[i]];
}
memcpy(stable,src.stable,src.size*sizeof(long int));
return *this;
}
//***************************************************************************************************************************************************//
//global//
//overload operator <<
ostream& operator<<(ostream& stream,const SeriesArray& src)
{
for (int i=0;i<src.size;i++)
{
for (int j=0;j<src.count_arr[i];j++)
{
stream << " " << src.stable[i][j] << " " ;
}
stream << "nnn" ;
}
return stream;
}
//print
void print(SeriesArray src)
{
cout << src;
cout << "n";
} // print
//main
int main()
{
long int arr1[20] = {23, 91, -71, -63, 22, 55, 51, 73, 17, -19,
-65, 44, 95, 66, 82, 85, 97, 30, 54, -34};
long int arr2[10] = {0, 1, -7, -6, 2, 5, 6, 7, 1, -1};
int count[20], i, j, n =20, sno;
long int *parr[20];
SeriesArray s1(arr1, 20);
SeriesArray s2(arr2, 10);
SeriesArray s3(arr2, 10);
cout << "narr1:n";
for(i=0; i < 20; i++)
cout << " " << arr1[i] << " ";
cout << "n";
cout << "nntable:n";
print(s1);
cout << "narr2n";
for(i=0; i < 10; i++)
cout << " " << arr2[i] << " ";
cout << "n";
cout << "nntable:n";
print(s2);
cout << "ns3: n";
print(s3);
s3 = s1;
cout << "ns3 again: n";
print(s3);
cout << "ns1 again: n";
print(s1);
cin>>i;
return 0;
} // main
问题出在你的赋值运算符上,这几乎是正确的,但几乎正确还不够好
for (int i=0;i<size;i++)
{
// count_arr[i]=rhs.count_arr[i];
stable[i]=new long int[src.count_arr[i]];
}
memcpy(stable,src.stable,src.size*sizeof(long int));
我想你的意思是
for (int i = 0; i < size; i++)
{
stable[i] = new long int[src.count_arr[i]];
memcpy(stable[i], src.stable[i], src.count_arr[i]*sizeof(long int));
}
你在复制构造函数中也有同样的错误
SeriesArray::SeriesArray(const SeriesArray& src )
{
size=src.size;
count_arr=new int[size];
stable=new LONG_INT_PTR[size];
for (int i=0;i<size;i++)
{
count_arr[i]=src.count_arr[i];
stable[i]=new long int[count_arr[i]];
}
memcpy(this->stable,src.stable,src.size*sizeof(long int));
}
应该是
SeriesArray::SeriesArray(const SeriesArray& src )
{
size=src.size;
count_arr=new int[size];
stable=new LONG_INT_PTR[size];
for (int i=0;i<size;i++)
{
count_arr[i]=src.count_arr[i];
stable[i]=new long int[count_arr[i]];
memcpy(stable[i], src.stable[i], src.count_arr[i]*sizeof(long int));
}
}
对于我所采取的不是一件坏事,这是您第一次尝试 2D 阵列。
在赋值运算符中,您需要复制stable
中每个条目的内容,而不是在一个memcpy
中复制整个批次。
(更好的方法是将赋值运算符更改为使用复制和交换,或者最好仍然使用vector
并使整个大小成为十分之一。
顺便说一句,您可能希望print
获取常量引用而不是复制其参数。
我尝试了您的程序,还有一些错误导致程序在运行时失败(使用 gcc 编译程序(。
void print(SeriesArray src)
这是按值调用。这将导致函数打印调用复制构造函数(查看此页面(。一旦你离开打印,src就会被删除(程序将调用析构函数(。这是一个问题,因为您正在使用动态分配的内存。最好通过引用调用它,这将强制打印使用重载 = 赋值运算符。
void print(SeriesArray & src)
然后有一个无效的指针,正如您已经在我的评论中读到的那样。此外,您没有为稳定分配足够的空间。你应该像这样重写你的构造函数 - 或者如果你愿意,可以用更优雅的方式......
SeriesArray::SeriesArray(LONG_INT_PTR arr, int n )
{
size=n;
int j=0;
int s=0;
count_size=1;
count_arr=new int[size];
for (int i=0;i<size-1;i++)
{
if (arr[i]<arr[i+1])
count_size++;
else
{
count_arr[j]=count_size;
j++;
count_arr[j]=1;
count_size=1;
}
}
size=j+1;
stable=new LONG_INT_PTR[size];
for (int i=0;i<size;i++)
{
stable[i]=new long int[count_arr[i]];
for (int k=0;k<count_arr[i];k++)
{
stable[i][k]=arr[s];
s++;
}
}
}
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 使用Boost Interprocess创建托管共享内存需要很长时间
- 多个"常量引用"变量可以共享同一个内存吗?
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 字符串共享内存映射的向量
- CUDA 使用共享内存平铺 3D 卷积实现
- 共享内存:MapViewOfFile 返回错误 5
- 在共享缓冲区内存中创建 ::std::string 对象
- 如何在多写入器情况下对文件支持的共享内存中的大页面出错
- Directx 12 :在两个进程之间共享图形内存
- 有没有办法列出所有共享内存对象的名称?
- 子进程更新共享 mmap 内存,但父进程没有更改
- C++线程之间的内存共享
- 使用Windows共享内存共享小数据
- 更有效地使用fork()和写时复制内存共享
- 从托管代码到非托管代码跨共享内存共享整数数组
- 通过内存共享c++对象
- 内存共享;继承;基实例和派生实例;c++
- Matlab与c++在MEX中的内存共享
- 跨共享内存共享 std::字符串