고정 된 크기의 배열과 해당 배열의 인덱스로 구현 된 사용자 정의 FastStack 클래스가 있습니다.new 연산자가 기존 객체를 덮어 씁니다.
내 복사본 생성자에서 배열을 할당 한 다음 복사 배열의 각 개체를 새 배열에 할당합니다. 스택에있는 객체에는 refcounting이 있으므로 간단한 복사본보다는 할당이 사용됩니다.
배열을 할당 할 때 가끔 다른 스택의 배열 일부를 덮어 쓰는 것이 문제입니다. 예상 할 수 있듯이 이는 데이터가 참조 해제 될 때 최종 세그멘테이션 오류를 발생시킵니다.
class FastStack {
private:
int m_size, m_ptr;
ObjectRef* m_stack;
public:
FastStack(int size) : m_size(size), m_ptr(-1) {
m_stack = new ObjectRef[m_size];
}
FastStack(const FastStack& copy) : m_size(copy.m_size), m_ptr(copy.m_ptr) {
long a = (long)copy.m_stack[0];
m_stack = new ObjectRef[m_size];
if ((long)copy.m_stack[0] != a)
fprintf(stderr, "\nWe have a serious problem!\n\n");
for (int i = 0; i <= m_ptr; i++)
m_stack[i] = copy.m_stack[i];
}
~FastStack() {
delete[] m_stack;
}
};
class ObjectRef {
private:
DataObj* m_obj;
public:
ObjectRef() : m_obj(0) { }
ObjectRef(DataObj* obj) : m_obj(obj) {
if (m_obj) m_obj->addRef();
}
ObjectRef(const ObjectRef& obj) : m_obj(obj.m_obj) {
if (m_obj) m_obj->addRef();
}
~ObjectRef() {
if (m_obj) m_obj->delRef();
}
ObjectRef& operator=(DataObj* obj) {
if (obj) obj->addRef();
if (m_obj) m_obj->delRef();
m_obj = obj;
return *this;
}
ObjectRef& operator=(const ObjectRef& obj) {
if (obj.m_obj) obj.m_obj->addRef();
if (m_obj) m_obj->delRef();
m_obj = obj.m_obj;
return *this;
}
};
"우리에게는 심각한 문제가 있습니다!" segfault 직전에 gdb를 실행하면 new에 의해 생성 된 ObjectRef 중 하나가 다른 스택의 배열과 동일한 주소를가집니다.
나의 첫 번째 본능은 새로운 것이 이미 사용중인 메모리를 할당해서는 안된다는 것이지만 분명히 여기에있는 것처럼 보이며 나는 무엇을 할 수 있는지에 관해 완전한 손실을 느낍니다.
추가 : 나는 이런 일이 볼 수있는 시간에서 m_size = 2 m_ptr = 0
이 프로그램의 전체 코드는 https://github.com/dvpdiner2/pycdc에서 GitHub의에 있지만 매우 복잡하고 따라하기 어렵다.
어떤 컴파일러 버전입니까? 타사 라이브러리를 사용하고 있습니까? 빌드에서'sizeof (long) == sizeof (ObjectRef *) '가 확실합니까? 메모리를 할당하는 다른 프로그램의 수천 (수백만)에 영향을주지 않는 버그를 'new operator'에서 발견했을 수 있습니다. 아니면 우리에게 보여주지 않는 다른 코드에서 포인터 또는 배열 경계 오류가있을 가능성이 있습니다 ... – Blastfurnace
'FastStack :: operator ='가 누락되어'FastStack : : ~ Fastack'. 우리가 정말로 필요로하는 것은 실행할 때 문제를 보여주는 ** compilable example **입니다. ** 이와 같은 모든 코드 스 니펫과 마찬가지로 ** 충분한 코드를 놓치 셨습니다 ** 우리가 말할 수있는 것은 문제가 다른 곳에서 발생했다는 것입니다. –